home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / kernel / memdiag.1 < prev    next >
Internet Message Format  |  1989-05-08  |  65KB

  1. Path: xanth!ames!oliveb!sun!swap!page
  2. From: page%swap@Sun.COM (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i117:  memdiag - memory diagnostic tools
  5. Message-ID: <103653@sun.Eng.Sun.COM>
  6. Date: 8 May 89 18:41:09 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 1377
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: jc3b21!fgd3@uunet.UU.NET (Fabbian G. Dufoe)
  12. Posting-number: Volume 89, Issue 117
  13. Archive-name: kernel/memdiag.1
  14.  
  15. The memory diagnostic program (MD) identifies addresses which cause
  16. memory errors.  The memory quarantine program (MQ) removes defective
  17. addresses from the system's memory free list.
  18.  
  19. # This is a shell archive.
  20. # Remove anything above and including the cut line.
  21. # Then run the rest of the file through 'sh'.
  22. # Unpacked files will be owned by you and have default permissions.
  23. #----cut here-----cut here-----cut here-----cut here----#
  24. #!/bin/sh
  25. # shar: SHell ARchive
  26. # Run the following text through 'sh' to create:
  27. #    ReadMe
  28. #    MD.doc
  29. #    MQ.doc
  30. #    Memory.doc
  31. #    AddAddr.c
  32. #    MD.c
  33. #    MQ.c
  34. #    MD.uu
  35. #    MQ.uu
  36. # This is archive 1 of a 1-part kit.
  37. # This archive created: Mon May  8 11:35:21 1989
  38. echo "extracting ReadMe"
  39. sed 's/^X//' << \SHAR_EOF > ReadMe
  40. X     This archive contains source code, executables, and documentation for
  41. XMD, a memory diagnostic program, and MQ, a program to quarantine defective
  42. Xmemory locations.  Both programs are public domain.  When you unpack the
  43. Xarchive you should have the following files:
  44. X
  45. X     ReadMe--This file
  46. X     AddAddr.c--Source for a function used in MD
  47. X     Makefile--input for Lattice lmk to compile and link MD and MQ
  48. X     MD*--Executable memory diagnostic program
  49. X     MD.c--Source for memory diagnostic
  50. X     MD.doc--Documentation for memory diagnostic
  51. X     MD.uue*--Uuencoded executable memory diagnostic program
  52. X     Memory.doc--Background information on the Amiga's memory management
  53. X     MQ*--Executable memory quarantine program
  54. X     MQ.c--Source for memory quarantine
  55. X     MQ.doc--Documentation for memory quarantine
  56. X     MQ.uue*--Uuencoded executable memory quarantine
  57. X
  58. X*Archives will contain either the executable programs or the uuencoded
  59. X executables, but not both.
  60. X
  61. X     MD will run with any Amiga configuration but requires a stack size of
  62. X10000.  It does not take over the machine but it does soak up any available
  63. Xmemory while it is running.  It takes about 8 minutes to test a 2.5MB
  64. Xmachine.
  65. X
  66. X     MQ will run with any Amiga configuration and a stack size as small as
  67. X4000.  It suspends multi-tasking during its execution but only requires
  68. Xabout one second to run.
  69. SHAR_EOF
  70. echo "extracting MD.doc"
  71. sed 's/^X//' << \SHAR_EOF > MD.doc
  72. XMD--Memory Diagnostic
  73. X
  74. XSYNOPSIS: (CLI environment)
  75. X
  76. X     stack 10000
  77. X     MD [>reportfile] [-qaddressfile]
  78. X
  79. X
  80. XDESCRIPTION:
  81. X
  82. X     MD is a memory diagnostic program.  It tests your system's memory and
  83. Xreports any addresses where errors occur.  A memory error occurs when the
  84. Xvalue read from an address is not the value which was stored there.
  85. X
  86. X     MD runs from the Command Line Interface (CLI).  It requires a stack
  87. Xsize of 10000 bytes.  It writes its report to standard output.  It also
  88. Xsends status messages to standard error. If you want to save the report for
  89. Xlater review (and separate it from the status messages) redirect standard
  90. Xoutput to a file (for example, "MD >MD.rpt").
  91. X
  92. X
  93. XCOMMAND LINE OPTIONS:
  94. X
  95. X     The "-q" option builds a file of bad addresses for use by MQ, the
  96. Xmemory quarantine program.  Specify the filename to which you want the
  97. Xaddresses written immediately after the q without a space.  The file will
  98. Xcontain a list of addresses where MD found an error.
  99. X
  100. X     If you suspect intermittent memory problems you should run MD
  101. Xrepeatedly, saving the output to different files.  By comparing several
  102. Xreports you can identify addresses which fail occasionally.  The quarantine
  103. Xfiles MD produces are ASCII characters so you can edit them as necessary to
  104. Xbuild a complete list of defective addresses.
  105. X
  106. X     MD tests memory by comparing values read from an address with a known
  107. Xvalue previously written to that address.  It does not interfere with other
  108. Xtasks in the system (except by soaking up memory which they might need).  It
  109. Xsends its report to standard output so it can be redirected to a disk file
  110. Xor printer.
  111. X
  112. X
  113. XINPUT:
  114. X
  115. X     MD does not read external data.
  116. X
  117. X
  118. XOUTPUT:
  119. X
  120. X     The diagnostic report begins with a header identifying the program,
  121. Xauthor, and version, and the time of the test.  Next it lists the blocks of
  122. Xmemory it examined.  The listing gives the block's number, address (in
  123. Xhexadecimal notation), and size (in decimal).  Errors are listed as they are
  124. Xencountered, one to a line.  The line identifies the address where the error
  125. Xoccurred, the value found at that address, and the value MD expected to
  126. Xfind.  All values are hexadecimal.  For example:
  127. X
  128. X          ERROR! Address:   21646C  found: 20  expected:  0
  129. X
  130. XAt the end of the report MD records the number of errors it found.
  131. X
  132. X     As MD executes it displays status messages.  The messages advise the
  133. Xuser MD is allocating blocks, sorting them, initializing blocks, and testing
  134. Xthem.  They identify the block number and its size as well as the value used
  135. Xto initialize or test it.
  136. X
  137. X     If the -q option is specified on the command line MD will list all the
  138. Xaddresses where memory errors occurred to the specified file.  The addresses
  139. Xare expressed as ASCII characters representing hexadecimal values.  Each
  140. Xaddress is on a separate line.  The addresses are sorted in ascending order
  141. Xand there are no duplicates.
  142. X
  143. X
  144. XEXECUTION:
  145. X
  146. X     MD takes about 8 minutes to test a 2.5MB machine.  During that time
  147. Xthere will not be enough memory left to run other jobs.  When MD finishes,
  148. Xhowever, it will release all the memory it used and other jobs can resume
  149. Xwithout rebooting.  MD will not interfere with other jobs that are executing
  150. Xwhen it is invoked but it is possible to create a deadlock if there are
  151. Xother active jobs in the system.  Besides that, MD cannot test memory that
  152. Xis allocated to another process.  Consequently, it is best to run MD
  153. Ximmediately after booting the system.
  154. X
  155. X     The recommended way to run MD is to create a special Workbench boot
  156. Xdisk with at least 200 free blocks.  Deleting the Utilities directory will
  157. Xfree that much space from a standard Workbench disk.  Copy MD to the disk. 
  158. XChange the Startup-Sequence file in the s directory to set the stack size to
  159. X10000.  After booting with this disk use the date command to set the date
  160. Xand time if necessary.  Then you can execute MD as many times as you wish,
  161. Xdirecting the output to a different file each time.  By examining the
  162. Xreports you can identify the addresses where memory errors occurred.
  163. X
  164. X
  165. XPROGRAM LOGIC:
  166. X
  167. X     MD is quite simple.  It allocates all the memory the system will give
  168. Xit.  Then it writes a value into each address.  It compares the value it
  169. Xreads back with the one it wrote and if they're different it records the
  170. Xerror.
  171. X
  172. X     The algorithm for allocating memory is straightforward.  MD begins by
  173. Xrequesting a 1MB block of memory.  Each time its request is successful it
  174. Xrepeats it.  When the request fails MD cuts its block size in half and tries
  175. Xagain.  The iteration ends when MD can't get any 1-byte blocks.
  176. X
  177. X     MD sorts the blocks into ascending order so the report it produces will
  178. Xbe a little easier to follow.  That's purely a cosmetic feature to make the
  179. Xuser more comfortable.  (Remember, I was the user for whom it was written
  180. Xand ordered lists make more sense to me.)
  181. X
  182. X     MD tests memory with four values.  They are 0, 0xff, 0x55, and 0xaa.
  183. XThe test begins by initializing all the bytes in each block to 0.  Next the
  184. Xcontents of each byte are compared to 0.  If the values don't match MD
  185. Xreports the error.  It stores the next test value at that address and moves
  186. Xon.  When all the memory has been checked for the first value and loaded
  187. Xwith the next value MD makes a second pass through all the memory.  A third
  188. Xpass checks for 0x55 and loads 0xaa.  The final pass looks for 0xaa in each
  189. Xbyte.
  190. X
  191. X     At first glance it seems less efficient to make so many passes through
  192. Xmemory.  Why not test all four values at each byte before moving on to the
  193. Xnext address?  There are two reasons.  Had the program been written
  194. Xsomething like this:
  195. X
  196. X          char *address;
  197. X          for (address = start; address < end; address++)
  198. X          {
  199. X               *address = 0;
  200. X               if (*address != 0)
  201. X                    printf("ERROR! ...");
  202. X               *address = 0xff;
  203. X               if (*address != 0xff)
  204. X                    printf("ERROR! ...");
  205. X          }
  206. X
  207. Xthe compiler might outsmart you.  It could see that nothing is done with
  208. X*address so it might keep it in a register to speed up the program.  It
  209. Xwould be fast, all right, but it wouldn't tell you anything.
  210. X
  211. X     The second reason is to allow time for memory errors to occur.  The
  212. Xapproach I used reduces the possibility that an address might hold the
  213. Xcorrect value briefly but lose it after some time has passed.  I don't know
  214. Xhow probable that is.  It seemed a good idea to prevent it anyway.
  215. X
  216. X     After all the blocks have been tested MD returns them to the system's
  217. Xmemory free list.
  218. X
  219. X     Send questions, comments, or bug reports to:
  220. X
  221. X--Fabbian Dufoe
  222. X  350 Ling-A-Mor Terrace South
  223. X  St. Petersburg, Florida  33705
  224. X  813-823-2350
  225. X
  226. XUUCP: ...uunet!pdn!jc3b21!fgd3
  227. SHAR_EOF
  228. echo "extracting MQ.doc"
  229. sed 's/^X//' << \SHAR_EOF > MQ.doc
  230. XMQ--Memory Quarantine
  231. X
  232. X
  233. XSYNOPSIS: (CLI environment)
  234. X
  235. X     MQ [<addressfile] [>statusfile]
  236. X
  237. X
  238. XDESCRIPTION:
  239. X
  240. X     MQ makes addresses which cause memory errors unavailable to the system. 
  241. XIt works by removing those memory locations from the system's memory free
  242. Xlist so they appear to be allocated to another process.  MQ is intended as a
  243. Xtemporary fix for memory failures until you can replace the defective RAM
  244. Xchips.
  245. X
  246. X     MQ runs from the Command Line Interface (CLI).  It reads data from
  247. Xstandard input and writes a status message to standard output.
  248. X
  249. X
  250. XCOMMAND LINE OPTIONS:
  251. X
  252. X     MQ does not recognize any command line options.
  253. X
  254. X
  255. XINPUT:
  256. X
  257. X     MQ reads a list of addresses to be quarantined from standard input. 
  258. XThe addresses must be in ascending order and expressed as ASCII characters
  259. Xrepresenting hexadecimal values.  There can be a maximum of 100 addresses. 
  260. XMQ will ignore any addresses beyond the first 100.  If necessary additional
  261. Xaddresses can be quarantined by running MQ again with a different list. 
  262. XMQ's companion program, MD (a memory diagnostic), can produce a file for
  263. Xdirect input to MQ.
  264. X
  265. X
  266. XOUTPUT:
  267. X
  268. X     When MQ finishes it writes a status message to standard output.  The
  269. Xmessage tells the number of bytes that were quarantined.
  270. X
  271. X
  272. XEXECUTION:
  273. X
  274. X     MQ's execution time is usually less than the time required to load the
  275. Xprogram.  The entire process takes about a second.
  276. X
  277. X     The recommended way to use MQ is to put it in your Startup-Sequence
  278. Xfile.  It should appear in the Startup-Sequence as early as possible.  MQ
  279. Xwill fragment memory so certain applications may have to be run before you
  280. Xcan run MQ.  For example, if you want a recoverable RAM disk (RAD:) you must
  281. Xhave 880K of contiguous memory available.  If MQ doesn't leave you with that
  282. Xlarge a block you can run MQ after you create your RAD: disk.  You will have
  283. Xdefective memory in the RAD: disk but if it is in a location that isn't
  284. Xaccessed it will be harmless.
  285. X
  286. X     Use MD to create a file of defective memory locations.  Then copy that
  287. Xfile to your Workbench disk.  Add a line to your Startup-Sequence file
  288. Xinvoking MQ with standard input redirected from the address list file.  Then
  289. Xeach time you boot your system the defective memory locations will be
  290. Xquarantined.
  291. X
  292. X
  293. XPROGRAM LOGIC:
  294. X
  295. X     MQ searches the system's memory free list to find each chunk of free
  296. Xmemory which contains one or more of the bad addresses it reads from
  297. Xstandard input.  It modifies the memory free list so the bad addresses will
  298. Xbe excluded.  The smallest block of memory that can be allocated is eight
  299. Xbytes.  Thus the memory free list loses eight bytes for each bad address
  300. Xthat is quarantined.  MQ does not keep track of the quarantined memory so
  301. Xthere is no way to recover it without rebooting the system.
  302. X
  303. X     As MQ examines each block of memory it goes through its list of bad
  304. Xaddresses.  If the block ends before the bad address MQ goes on to the next
  305. Xblock.  If the block starts after the bad address MQ gets the next address.
  306. XIf the bad address falls within the block MQ resizes the block to exclude
  307. Xit.
  308. X
  309. X     Each block of memory is described by a MemChunk structure which
  310. Xcontains a pointer to the next block and the size of the current block.  The
  311. Xstructure is defined in exec/memory.h as follows:
  312. X
  313. X/****** MemChunk ****************************************************/
  314. X
  315. Xstruct   MemChunk
  316. X{
  317. X    struct  MemChunk *mc_Next;   /* pointer to next chunk */
  318. X    ULONG   mc_Bytes;      /* chunk byte size   */
  319. X};
  320. X
  321. X     MQ calculates the number of bytes between the start of the block and
  322. Xthe bad address, then rounds it down to a multiple of 8.  That will be the
  323. Xnew size of the block.  Let's call it Size1.  Then it adds that size plus 8
  324. Xto the beginning address of the block to get the starting address of a new
  325. Xblock.  We'll call it NewChunk.  To calculate the size of the new block MQ
  326. Xadds 8 to Size1 and subtracts the result from the original block size. We'll
  327. Xcall it Size2.
  328. X
  329. X     Because the original block may be as small as 8 bytes and because the
  330. Xbad address may be within 8 bytes of either end of the block Size1 and Size2
  331. Xmay be zero.  If Size2 is zero MQ simply reduces the size of the original
  332. Xblock by storing Size1 in the original block's mc_Bytes field. Otherwise it
  333. Xcreates a new block at NewChunk.
  334. X
  335. X     Each block of memory contains a pointer to the next block (mc_Next) and
  336. Xthe size of the current block (mc_Bytes).  So MQ takes the next block
  337. Xpointer from the original block and puts it at NewChunk->mc_Next.  Then it
  338. Xputs Size2 at NewChunk->mc_Bytes.
  339. X
  340. X     If Size1 is zero MQ copies the address from the original block's
  341. Xmc_Next field to the mc_Next field of the previous block.  If the previous
  342. Xblock pointer is NULL the original block is the first one in the list.  In
  343. Xthat case MQ copies the mc_Next field from the original block to the
  344. Xmh_First field in the MemHeader structure.
  345. X
  346. X     Send questions, comments, or bug reports to:
  347. X
  348. X--Fabbian Dufoe
  349. X  350 Ling-A-Mor Terrace South
  350. X  St. Petersburg, Florida  33705
  351. X  813-823-2350
  352. X
  353. XUUCP: ...uunet!pdn!jc3b21!fgd3
  354. SHAR_EOF
  355. echo "extracting Memory.doc"
  356. sed 's/^X//' << \SHAR_EOF > Memory.doc
  357. XMemory Management on the Amiga
  358. X     by Fabbian G. Dufoe, III
  359. X
  360. X     Because AmigaDOS is a multi-tasking operating system it requires a more
  361. Xcomplicated memory management scheme than most personal computer operating
  362. Xsystems have.  Single-tasking systems can get by with setting the upper and
  363. Xlower limits of the free memory region.  With different processes starting
  364. Xand stopping independently free memory gets fragmented.  The system has to
  365. Xknow where to find each fragment if it's to use memory efficiently.
  366. X
  367. X     AmigaDOS keeps a list of available memory.  When a process needs RAM it
  368. Xasks the operating system to allocate some.  The system searches the memory
  369. Xfree list to see if there is a big enough block available.  If so it
  370. Xallocates it to the process and removes it from the memory free list.  When
  371. Xthe process frees the memory the system returns it to the memory free list. 
  372. XThe operating system doesn't keep track of which process allocated the
  373. Xmemory, so if a process fails to return it there is no way to recover it
  374. Xwithout rebooting the system.
  375. X
  376. X     Like everything in the Amiga's operating system, the path to the memory
  377. Xfree list begins with a pointer to the exec library ExecBase structure.  The
  378. XExecBase structure and all the structures and lists the system uses for
  379. Xmemory management are defined in the include files listed in the ROM Kernel
  380. XExec Manual.  These same files are supplied with your C compiler or
  381. Xassembler.   They are also available in the Native Developer's Kit available
  382. X>from Commodore Amiga Technical Support (CATS).
  383. X
  384. X     Opening the exec library returns a pointer to the ExecBase structure:
  385. X
  386. X     struct ExecBase *ExecBase;
  387. X     ExecBase = (struct ExecBase *)OpenLibrary("exec.library, 0L);
  388. X
  389. X     The ExecBase structure is defined in exec/execbase.h.  One of the
  390. Xfields in the ExecBase structure is MemList.  It's a List structure that
  391. Xcontains pointers to the list of memory regions which make up the memory
  392. Xfree list.  There is a MemList structure documented in the ROM Kernel Manual
  393. Xand in exec/memory.h.  It is not related to the List structure named MemList
  394. Xin the ExecBase structure.  The similar names could easily confuse you.
  395. X  
  396. X     Exec/lists.h defines a List structure as follows:
  397. X
  398. X     struct List { 
  399. X         struct  Node *lh_Head;
  400. X         struct  Node *lh_Tail;
  401. X         struct  Node *lh_TailPred;
  402. X         UBYTE   lh_Type;
  403. X         UBYTE   l_pad;
  404. X     };
  405. X
  406. XThe Node structure is defined in exec/nodes.h as follows:
  407. X
  408. X     struct Node { 
  409. X         struct  Node *ln_Succ;
  410. X         struct  Node *ln_Pred;
  411. X         UBYTE   ln_Type;
  412. X         BYTE    ln_Pri; 
  413. X         char    *ln_Name; 
  414. X     };
  415. X
  416. X     The memory free list is organized as a list of lists.  MemList points
  417. Xto a list of memory regions.  A region is a block of contiguous memory from
  418. Xwhich Exec can draw memory.  Each region is described by a MemHeader
  419. Xstructure.  When the system is initialized it creates a region for chip RAM
  420. Xand one for each expansion RAM board in the system.
  421. X
  422. X     If the expansion RAM boards occupy contiguous memory you can combine
  423. Xtheir regions into one with a program called MergeMem.  MergeMem is in the
  424. XSystem directory of the 1.3 Workbench disk.
  425. X
  426. X     The MemHeader structure is documented in exec/memory.h as follows:
  427. X
  428. X     struct     MemHeader {
  429. X         struct  Node mh_Node;
  430. X         UWORD   mh_Attributes;     /* characteristics of this region */
  431. X         struct  MemChunk *mh_First; /* first free region          */
  432. X         APTR    mh_Lower;          /* lower memory bound          */
  433. X         APTR    mh_Upper;          /* upper memory bound+1          */
  434. X         ULONG   mh_Free;          /* total number of free bytes     */ 
  435. X     };
  436. X
  437. X     So the following gives the address of the first region in the memory
  438. Xfree list:
  439. X
  440. X     struct MemHeader *MemHeader;
  441. X     MemHeader = (struct MemHeader *)ExecBase->MemList.lh_Head;
  442. X
  443. X     The MemHeader structure begins with a Node structure (mh_Node) which
  444. Xlinks this region to the others in the system's memory free list.  Within
  445. Xthe Node structure mh_Node.ln_Succ points to the next region and
  446. Xmh_Node.ln_Pred points to the preceding one.  In the first node in the list
  447. Xmh_Node.ln_Pred points to the head of the list (MemHeader == MemHeader-
  448. X>mh_Node.ln_Pred).
  449. X
  450. X     The MemHeader structure defines the upper (mh_Upper) and lower limits
  451. X(mh_Lower) of the region and tells how many bytes it currently has available
  452. X(mh_Free).  It contains a pointer to the first chunk of free memory
  453. X(mh_First).
  454. X
  455. X     Memory chunks are organized as a singly linked list.  The NewChunk
  456. Xstructure (documented in exec/memory.h) contains the address of the next
  457. Xchunk in mc_Next and the number of bytes in this chunk in mc_Bytes:
  458. X
  459. X     struct   MemChunk {
  460. X         struct  MemChunk *mc_Next;   /* pointer to next chunk */
  461. X         ULONG   mc_Bytes;      /* chunk byte size   */
  462. X     };
  463. X
  464. XA NULL pointer in mc_Next marks the end of the list.
  465. X
  466. X     Before any memory is allocated from a region there will be just one
  467. Xchunk in the list.  The fields mh_First and mh_Lower will be equal and
  468. Xmh_Upper will be the same as mh_Free.  The smallest amount of memory that
  469. Xcan be allocated is eight bytes.  That's because the smallest chunk of
  470. Xmemory that can be replaced on the memory free list is eight bytes.  A
  471. XMemChunk requires four bytes for mc_Next (a 32-bit address) and four bytes
  472. Xfor mc_Bytes (an unsigned long integer).
  473. X
  474. X     When the first block of memory is allocated from a region the size of
  475. Xthe block is added to mh_First and mh_Free is reduced by the size of the
  476. Xblock.  In the MemChunk structure mc_Next remains NULL and mc_Bytes is
  477. Xreduced by the amount of memory allocated.
  478. X
  479. X     If a second block is allocated from the same region the size of the
  480. Xsecond block will be added to mh_First and subtracted from mh_Free and
  481. Xmc_Bytes.  There will still be just one chunk in the list, although it will
  482. Xbe smaller.
  483. X
  484. X     The first fragmentation of the region occurs when the first block is
  485. Xfreed while the second remains allocated.  Then mh_First will be restored to
  486. Xits original value (equal to mh_Lower) and mh_Free will be increased by the
  487. Xsize of the block.  The address pointed to by mh_First (which is mc_Next)
  488. Xwill be loaded with the previous value of mh_First.  The size of the block
  489. Xwill be loaded into mc_Bytes for the first MemChunk structure.
  490. X
  491. X     Given Block1 as the size of the first block and Block2 as the size of
  492. Xthe second block, the following relationships will be true after the first
  493. Xblock is freed:
  494. X
  495. X     mh_First == mh_Lower
  496. X     mh_Upper == mh_Free + Block2
  497. X     &mc_Next == mh_First
  498. X     mc_Next == &mc_Next + Block1 + Block2
  499. X     mc_Bytes == Block1
  500. X     mc_Next->mc_Next == NULL
  501. X     mc_Next->mc_Bytes == mh_Free - (Block1 + Block2)
  502. X
  503. XWhen the last block is freed mh_Free will equal the difference between
  504. Xmh_Upper and mh_Lower, mc_Next will be set to NULL, and mc_Bytes will be the
  505. Xsame as mh_Free.  In other words, the region will be restored to its
  506. Xoriginal configuration with a single chunk that contains all the memory in
  507. Xthe region.
  508. X
  509. X     Chapter 6 of the Rom Kernel Manual: Exec describes the memory
  510. Xallocation routines Exec provides for programmers.  There are three pairs of
  511. Xroutines.  AllocMem() and FreeMem() use the system's memory free list to
  512. Xmanage one block per call.  AllocEntry() and FreeEntry() process multiple
  513. Xblocks with a single call.  Allocate() and Deallocate() allow you to manage
  514. Xblocks from a private memory free list.
  515. SHAR_EOF
  516. echo "extracting AddAddr.c"
  517. sed 's/^X//' << \SHAR_EOF > AddAddr.c
  518. Xvoid
  519. XAddAddr(address)
  520. Xunsigned char *address;
  521. X{
  522. X   extern unsigned char *Addr[];
  523. X   extern short int AddrCnt;
  524. X   int i;
  525. X
  526. X   /* If it's the first address we just add it. */
  527. X   if (AddrCnt == 0)
  528. X      Addr[AddrCnt++] = address;
  529. X   else
  530. X   {
  531. X      /* If there are already 100 addresses we can't process any more so
  532. X         we'll just return. */
  533. X      if (AddrCnt == 100)
  534. X         return;
  535. X
  536. X      /* We'll compare the new address against each one in the list until we
  537. X         find the appropriate place to insert it. */
  538. X      for (i = 0; i < AddrCnt; i++)
  539. X      {
  540. X         /* If the new address is smaller than the current address in the
  541. X            array we'll insert the new one at this position. */
  542. X         if (address < Addr[i])
  543. X         {
  544. X            /* We need a temporary loop counter so we can move all the array
  545. X               entries from the current one to the end down one position to
  546. X               make room for the new address. */
  547. X            int j;
  548. X
  549. X            for (j = AddrCnt; j > i; j--)
  550. X               Addr[j] = Addr[j-1];
  551. X            Addr[i] = address;
  552. X            AddrCnt++;
  553. X            break;
  554. X         }
  555. X
  556. X         /* If the address is already in the list we'll skip it. */
  557. X         if (address == Addr[i])
  558. X            break;
  559. X      }
  560. X
  561. X      /* If the new address is higher than the last one on the list we'll
  562. X         add it to the end of the array. */
  563. X      if (address > Addr[AddrCnt-1])
  564. X         Addr[AddrCnt++] = address;
  565. X
  566. X      return;
  567. X   }
  568. X}
  569. X
  570. SHAR_EOF
  571. echo "extracting MD.c"
  572. sed 's/^X//' << \SHAR_EOF > MD.c
  573. X/* MD.c
  574. X
  575. X   by Fabbian G. Dufoe, III
  576. X
  577. X   This is a public domain program.  Use it however you like.
  578. X
  579. X   This program tests all the memory which the operating system will
  580. X   allocate to it.  It writes a test value to each address.  Then it reads
  581. X   each address and compares the result with the test value.  If the value
  582. X   read from memory doesn't match the test value the program writes the
  583. X   address (the pointer value), the expected contents, and the actual
  584. X   contents of the memory location to standard output.  When all allocated
  585. X   memory has been tested against one test value the program moves to the
  586. X   next one.  The test values are 0x00, 0xff, 0x55, and 0xaa.
  587. X
  588. X   A command line option directs the program to write a list of bad
  589. X   addresses to a file.  The file will contain all the addresses at which an
  590. X   error was detected.  The addresses will be listed in ascending order and
  591. X   each address will appear only once.  Addresses will be separated by
  592. X   newlines.  The addresses will be ASCII characters representing
  593. X   hexadecimal values.  The program will not list more than 100 addresses.
  594. X
  595. X   While the program is running it writes status messages to standard error.
  596. X
  597. X   Usage: MD [>reportfile] [-qaddressfile]
  598. X*/
  599. X
  600. X#define NULL 0L
  601. X#define SIZE 1000
  602. X#define VERSION "Version 1.1, 10 April 1989\n\n"
  603. X#define USAGE "Usage: MD [>reportfile] [-qaddressfile]\n"
  604. X
  605. X#include <time.h>
  606. X#include <stdio.h>
  607. X
  608. Xtypedef struct
  609. X{
  610. X   unsigned char *ptr;
  611. X   unsigned long int size;
  612. X} Block;
  613. X
  614. Xunsigned char *Addr[100];
  615. Xunsigned short int AddrCnt = 0;
  616. X
  617. Xvoid
  618. Xmain(argc, argv)
  619. Xint argc;
  620. Xchar **argv;
  621. X{
  622. X   void AddAddr(unsigned char *);
  623. X   FILE *AddrFile;
  624. X   unsigned short int AddrList = 0;
  625. X   Block block[SIZE];
  626. X   unsigned short int count = 0;
  627. X   unsigned long int errct = 0;
  628. X   unsigned short int high;
  629. X   unsigned short int i;
  630. X   unsigned long int offset;
  631. X   unsigned char *ptr;
  632. X   unsigned long int size;
  633. X   signed long int t;
  634. X   static unsigned char TestVal[] = {0, 0xff, 0x55, 0xaa};
  635. X   unsigned short int val;
  636. X
  637. X   /* We need to check for command line arguments.  A "-q" directs the
  638. X      program to write a file of bad addresses. */
  639. X   if (argc == 2 && argv[1][0] == '-' && argv[1][1] == 'q')
  640. X   {
  641. X      /* If we can't open the file we'll terminate the program with an error
  642. X         message. */
  643. X      if ((AddrFile = fopen(&argv[1][2], "w")) == NULL)
  644. X      {
  645. X         fputs(USAGE, stderr);
  646. X         fputs("Cannot open output file.\n", stderr);
  647. X         exit(30);
  648. X      }
  649. X      AddrList = 1;
  650. X   }
  651. X   else if (argc > 1)
  652. X   {
  653. X      /* If the command line arguments were incorrect we'll terminate the
  654. X         program with a usage message. */
  655. X      fputs(USAGE, stderr);
  656. X      exit(30);
  657. X   }
  658. X
  659. X   /* We want to include the time the diagnostic program was run in the
  660. X      report.  That requires getting the current system time.
  661. X   */
  662. X   time(&t);
  663. X
  664. X   /* We'll print a report heading and copyright notice at the beginning.
  665. X   */
  666. X   printf("MD--Memory Diagnostic.\n");
  667. X   printf("by Fabbian G. Dufoe, III\n");
  668. X   printf(VERSION);
  669. X   printf("Memory tested %s\n\n", ctime(&t));
  670. X
  671. X   /* We'll start by allocating memory in blocks of one megabyte.  The plan
  672. X      is to allocate as many one-megabyte blocks as we can.  Then we'll
  673. X      halve the block size, allocate as many blocks of that size as we can,
  674. X      and repeat the process until (a) all the memory is gone or (b) we've
  675. X      filled the array we allocated for keeping track of memory blocks.
  676. X   */
  677. X   size = 1048576;
  678. X   while (size > 0 && count < SIZE)
  679. X   {
  680. X      fprintf(stderr, "Allocating %ld byte blocks.\n", size);
  681. X      while ((ptr = (unsigned char *)malloc(size)) != NULL)
  682. X      {
  683. X         block[count].ptr = ptr;
  684. X         block[count++].size = size;
  685. X      }
  686. X      if (size == 1)
  687. X         size = 0;
  688. X      else
  689. X         size >>= 1;
  690. X   }
  691. X
  692. X   /* Because we expect seldom to use the entire array we've set aside we
  693. X      need to save the number of the highest element actually used.
  694. X   */
  695. X   high = count;
  696. X
  697. X   /* At this point we want to sort the block pointers.  It makes the output
  698. X      easier to follow if memory errors are reported in ascending order
  699. X      by their address.  We aren't guaranteed that memory will be
  700. X      allocated in any particular order.  We'll use an insertion sort and
  701. X      we'll sort only that part of the array we used.  That means we'll
  702. X      keep the index values between 0 and high.
  703. X
  704. X      An insertion sort works by shifting all the items left of the current
  705. X      one right one position until an item is less than the current one.
  706. X      Imagine the items to be sorted are laid out from left to right.  Then
  707. X      the sort places the current item in the position vacated by the last
  708. X      item to be shifted right.  The sort starts with the second item as
  709. X      the current one and proceeds to the right until all the items have had
  710. X      a turn as the current one.
  711. X   */
  712. X   fprintf(stderr, "Sorting block list.\n");
  713. X   for (count = 1; count < high; count++)
  714. X   {
  715. X      short int i;
  716. X
  717. X      ptr = block[count].ptr;
  718. X      size = block[count].size;
  719. X      i = count - 1;
  720. X      while (i >=0 && ptr < block[i].ptr)
  721. X      {
  722. X         block[i+1].ptr = block[i].ptr;
  723. X         block[i+1].size = block[i].size;
  724. X         i--;
  725. X      }
  726. X      block[i+1].ptr = ptr;
  727. X      block[i+1].size = size;
  728. X   }
  729. X   fprintf(stderr, "Sort complete.\n");
  730. X
  731. X   /* We'll list the block addresses and size in the report.
  732. X   */
  733. X   printf("Blocks examined:\n");
  734. X   printf("Block #    Address         Size\n\n");
  735. X   for (count = 0; count < high; count++)
  736. X   {
  737. X      printf("%4d      %8lX      %7ld\n", count, block[count].ptr,
  738. X             block[count].size);
  739. X   }
  740. X   printf("\n");
  741. X
  742. X   /* Now that we've sorted our list of blocks we're ready to start testing
  743. X      them.  The first step is to initialize all the variables to 0, the
  744. X      first test value.
  745. X   */
  746. X   for (count = 0; count < high; count++)
  747. X   {
  748. X      fprintf(stderr, "Initializing block %d, %ld bytes.\n", count,
  749. X                      block[count].size);
  750. X      for (offset = 0; offset < block[count].size; offset++)
  751. X         *(block[count].ptr+offset) = TestVal[0];
  752. X   }
  753. X
  754. X   /* Next we'll go through all the blocks to see if they contain the test
  755. X      value with which they were loaded.  If not we'll identify the address
  756. X      that failed, the value it contained, and the value it should have
  757. X      contained.  We'll do that for each valid test value.
  758. X   */
  759. X   for (val = 1; val < 4; val++)
  760. X   {
  761. X      fprintf(stderr, "Testing value %X.\n", TestVal[val-1]);
  762. X      for (count = 0; count < high; count++)
  763. X      {
  764. X         fprintf(stderr, "Testing block %d, %ld bytes with %X\n", count,
  765. X                         block[count].size, TestVal[val-1]);
  766. X         for (offset = 0; offset < block[count].size; offset++)
  767. X         {
  768. X            if (*(block[count].ptr+offset) != TestVal[val-1])
  769. X            {
  770. X               printf("ERROR! Address: %8lX  found: %2X  expected: %2X\n",
  771. X                       block[count].ptr+offset, *(block[count].ptr+offset),
  772. X                       TestVal[val-1]);
  773. X               errct++;
  774. X               AddAddr(block[count].ptr+offset);
  775. X            }
  776. X            *(block[count].ptr+offset) = TestVal[val];
  777. X         }
  778. X      }
  779. X   }
  780. X
  781. X   /* We've tested for all values except the last one.  It's time to do that
  782. X      now.
  783. X   */
  784. X   val--;
  785. X   fprintf(stderr, "Testing value %X.\n", TestVal[val]);
  786. X   for (count = 0; count < high; count++)
  787. X   {
  788. X      fprintf(stderr, "Testing block %d, %ld bytes with %X\n", count,
  789. X              block[count].size, TestVal[val]);
  790. X      for (offset = 0; offset < block[count].size; offset++)
  791. X      {
  792. X         if (*(block[count].ptr+offset) != TestVal[val])
  793. X         {
  794. X            printf("ERROR! Address: %8lX  found: %2X  expected: %2X\n",
  795. X                    block[count].ptr+offset, *(block[count].ptr+offset),
  796. X                    TestVal[val]);
  797. X            errct++;
  798. X            AddAddr(block[count].ptr+offset);
  799. X         }
  800. X      }
  801. X   }
  802. X
  803. X   /* The testing is finished so we'll report the number of errors we found.
  804. X   */
  805. X   printf("\nMD found %d errors.\n", errct);
  806. X
  807. X   /* When we've completed all our tests we free all the memory we allocated
  808. X      and exit. */
  809. X   for (count = 0; count < high; count++)
  810. X   {
  811. X      fprintf(stderr, "Freeing block %d.\n", count);
  812. X      free(block[count].ptr);
  813. X   }
  814. X
  815. X   /* If an address list file was requested we'll write it and close the
  816. X      file. */
  817. X   if (AddrList == 1)
  818. X   {
  819. X      for (i = 0; i < AddrCnt; i++)
  820. X         fprintf(AddrFile, "%8lX\n", Addr[i]);
  821. X      fclose(AddrFile);
  822. X   }
  823. X
  824. X   exit(0);
  825. X}
  826. SHAR_EOF
  827. echo "extracting MQ.c"
  828. sed 's/^X//' << \SHAR_EOF > MQ.c
  829. X/* MQ.c  Memory Quarantine
  830. X
  831. X   by Fabbian G. Dufoe, III
  832. X
  833. X   This program walks the memory free list.  If it finds memory on the free
  834. X   list which has been identified as defective by MD (Memory Diagnostic) it
  835. X   patches the memory free list so that memory will appear to be already
  836. X   allocated.  The memory cannot be recovered until the system is restarted.
  837. X
  838. X   The program begins by getting a pointer to the system's memory free list.
  839. X   For each entry in the list it compares the starting and ending addresses
  840. X   of the free memory block against the addresses of the defective memory.
  841. X   If a defective memory address falls within the free block MQ changes the
  842. X   entry for the free block so the free block will appear to end just short
  843. X   of the defective address.  Then it adds a new entry to the list.  The new
  844. X   entry identifies a free block beginning just after the defective address
  845. X   and continuing to the point where the original block ended.  This process
  846. X   is repeated for each defective address and for each free block.
  847. X*/
  848. X
  849. X#include <stdio.h>
  850. X#include <exec/types.h>
  851. X#include <exec/exec.h>
  852. X#include <exec/execbase.h>
  853. X
  854. Xstruct ExecBase *ExecBase;
  855. X
  856. Xvoid
  857. Xmain()
  858. X{
  859. X   ULONG BadAddr[100];
  860. X   int bytes = 0;
  861. X   int i;
  862. X   int last = 0;
  863. X   struct MemChunk *LastChunk = NULL;
  864. X   struct MemChunk *MemChunk;
  865. X   struct MemHeader *MemHeader;
  866. X
  867. X   while ((scanf("%8lX\n", &BadAddr[last++]) != EOF) && (last < 100));
  868. X   last--;
  869. X
  870. X   if ((ExecBase = (struct ExecBase *)
  871. X                   OpenLibrary("exec.library", 0L)) == NULL)
  872. X      exit(20);
  873. X
  874. X   Forbid();
  875. X   MemHeader = (struct MemHeader *)ExecBase->MemList.lh_Head;
  876. X
  877. X   while(MemHeader->mh_Node.ln_Succ)
  878. X   {
  879. X      for (MemChunk = MemHeader->mh_First; MemChunk;
  880. X            MemChunk = MemChunk->mc_Next)
  881. X      {
  882. X         for (i = 0; i < last; i++)
  883. X         {
  884. X            struct MemChunk *NewChunk;
  885. X            ULONG Size1;
  886. X            ULONG Size2;
  887. X
  888. X            /* If chunk ends before bad address get next chunk. */
  889. X            if ((ULONG)MemChunk + MemChunk->mc_Bytes - 1 < BadAddr[i])
  890. X               break;
  891. X            /* If chunk begins after bad address get next address. */
  892. X            if ((ULONG)MemChunk > BadAddr[i])
  893. X               continue;
  894. X            /* Bad address falls within chunk. */
  895. X            Size1 = BadAddr[i] - (ULONG)MemChunk;
  896. X            Size1 = Size1 - Size1 % 8;
  897. X            Size2 = MemChunk->mc_Bytes - Size1 - 8;
  898. X            NewChunk = (struct MemChunk *)((ULONG)MemChunk + Size1 + 8);
  899. X            if (Size2 == 0)
  900. X               MemChunk->mc_Bytes = Size1;
  901. X            else
  902. X            {
  903. X               NewChunk->mc_Next = MemChunk->mc_Next;
  904. X               NewChunk->mc_Bytes = Size2;
  905. X               MemChunk->mc_Next = NewChunk;
  906. X               MemChunk->mc_Bytes = Size1;
  907. X            }
  908. X            if (Size1 == 0)
  909. X            {
  910. X               if (LastChunk == NULL)
  911. X                  MemHeader->mh_First = MemChunk->mc_Next;
  912. X               else
  913. X                  LastChunk->mc_Next = MemChunk->mc_Next;
  914. X            }
  915. X            MemHeader->mh_Free -= 8;
  916. X            bytes += 8;
  917. X         }
  918. X         LastChunk = MemChunk;
  919. X      }
  920. X      MemHeader = (struct MemHeader *)MemHeader->mh_Node.ln_Succ;
  921. X   }
  922. X   Permit();
  923. X   printf("MQ: %d bytes quarantined.\n", bytes);
  924. X   return;
  925. X}
  926. SHAR_EOF
  927. echo "extracting MD.uu"
  928. sed 's/^X//' << \SHAR_EOF > MD.uu
  929. X
  930. Xbegin 644 MD
  931. XM```#\P`````````#``````````(```J3`````````F\```/I```*DR1()`!)K
  932. XM^0````!'^0``!5!R`"`\```!&V`")L%1R/_\+'@`!"E.!8@I3P600JP%C"9NA
  933. XM`11P`"(\```P`$ZN_LXI:P"8!81*JP"L9P``<"`/D*\`!`:`````@"E`!51AC
  934. XM``$N(&L`K-'(T<@B:``0T\G3R2`"<@`2&2E)!9C0@5*`0F=2@`)`__Z?P%6`)
  935. XM0G<(`"`"4X#4@1^R```@`%."4<C_]A^\`"`@`%."'[$@`"``4<K_^")/+PE@Z
  936. XM``!X*6L`.@54<']2@-&L!51A``#"0>L`7$ZN_H!!ZP!<3J[^C"E`!8PO`"1`V
  937. XM("H`)&<2+&P)D"!`(B@``"E!!81.KO^"(BH`(&<:)#P```/M3J[_XBE`!91GU
  938. XM"N6(($`G:``(`*0@;`6,+PA(;`50(&@`)"EH``0%F$ZZ!M1.N@U0<`!@!"`OW
  939. XM``0O`"`L!7QG!"!`3I!.NBA<+'@`!")L"9!.KOYB3KH&JDJL!8QG&B(L!91GN
  940. XM!$ZN_]PL>``$3J[_?")L!8Q.KOZ&(!\N;`603G5P9&"T0_H`$'``3J[]V"E`I
  941. XM"9!G[$YU9&]S+FQI8G)A<GD`3E7@G+_L!51E`!'>2.<W,BXO'XPF;Q^0?`!ZI
  942. XM`'``*T#@M'("OH%F5"!K``1P+;`09DI#Z``!<'&P$69`0^@``DAL``8O"4ZZ3
  943. XM'>Q03RM`__Q*@&8D2&P"_$AL``A.NAS&2&P"_$AL`#).NARZ2'@`'DZZ'^)/F
  944. XM[P`4?`%@'G`!OH!O&$AL`OQ(;`!,3KH<F$AX`!Y.NA_`3^\`#$AMX*!.NA(<<
  945. XM2&P`=DZZ!B!(;`".3KH&&$AL`*A.N@802&W@H$ZZ)/1/[P`4+P!(;`#&3KH&8
  946. XM9E!/*WP`$```X*0@+>"D<@"P@6-J#$4#Z&1D+P!(;`#:2&P"_$ZZ'/Y/[P`,@
  947. XM+RW@I$ZZ&`983RM`X*A*@&<D<@`R!>>!0>W@NB)(T\$B@"`%4D5R`#(`YX'1'
  948. XMP2%MX*0`!&#*<`&PK>"D9@AR`"M!X*1@F"`MX*3BB"M`X*1@C#M%X+)(;`#XO
  949. XM2&P"_$ZZ')A03WH!NFW@LF0``)QP`#`%YX!![>"Z(DC3P"M1X*C1P"MH``3@>
  950. XMI"`%4T`[0."<,"W@G$I`:T8B`$C!YX%![>"Z(DC3P21MX*BUT60P(@!(P>>!&
  951. XM0^W@PB1)U<$B`$C!YX$L2-W!))8D`$C"YX+3PM'!(V@`!``$4VW@G&"R,"W@0
  952. XMG$C`YX!![>#"(DC3P"*MX*@P+>"<2,#G@-'`(6W@I``$4D5@`/]@2&P!#DALK
  953. XM`OQ.NAOF4$](;`$>3KH$L%A/2&P!,$ZZ!*983WH`NFW@LF0L<``P!7(`,@7G2
  954. XM@4'MX+HB2-/!T<$O*``$+Q$O`$AL`5).NA3R3^\`$%)%8,Y(;`%L3KH$:%A/'
  955. XM>@"Z;>"R9%QP`#`%<@`R!>>!0>W@NM'!+R@`!"\`2&P!;DAL`OQ.NAMH3^\`K
  956. XM$$*MX*QP`#`%YX!![>"Z(DC3P"`MX*RPJ0`$9!9R`#(%YX'1P2)0T\`2K``"T
  957. XM4JW@KD5@GCM\``'@GC`MX)YR!+!!9``!)G(`,@!P`$'L``$0,!@`+P!(F
  958. XM;`&22&P"_$ZZ&P!/[P`,>@"Z;>"R9```]'``,`5R`#(%YX%![>"ZT<%R`#(M*
  959. XMX)YT`$/L``$4,1@`+P(O*``$+P!(;`&F2&P"_$ZZ&KY/[P`40JW@K'``,`7G`
  960. XM@$'MX+HB2-/`("W@K+"I``1D``"8<@`R!>>!(DC3P211U<!T`#0MX)X6$D/LZ
  961. XM``&V,2@`9U`B2-/!)%'5P-'!(E#3P'``$!%R`#("=`!![``!%#`8`"\"+P`OJ
  962. XM"DAL`<Q.NA.<4JW@M'``,`7G@$'MX+K1P")0T^W@K"Z)3KD```<X3^\`$'``S
  963. XM,`7G@$'MX+K1P")0T^W@K$'L``(P+>">$K`(`%*MX*Q@`/]24D5@`/\(4FW@@
  964. XMGF``_M)3;>"><`!![``","W@GA`P"``O`$AL`?Y(;`+\3KH9V$_O``QZ`+IM&
  965. XMX+)D``#,<``P!7(`,@7G@4'MX+K1P7(`0^P``C(MX)X2,1@`+P$O*``$+P!(O
  966. XM;`(22&P"_$ZZ&9A/[P`40JW@K'``,`7G@$'MX+HB2-/`("W@K+"I``1D<G(`'
  967. XM,@7G@2)(T\$D4=7`%!)#[``"-BW@GK0Q.`!G3")(T\$D4=7`T<$B4-/`<``0.
  968. XM$7(`0>P``A(P.``O`2\`+PI(;`(X3KH2?E*MX+1P`#`%YX!![>"ZT<`B4-/MT
  969. XMX*PNB4ZY```'.$_O`!!2K>"L8`#_>%)%8`#_,"\MX+1(;`)J3KH"-%!/>@"Z`
  970. XM;>"R9"QP`#`%+P!(;`*`2&P"_$ZZ&-AP`#`%YX!![>"ZT<`ND$ZZ%\Y/[P`,=
  971. XM4D5@SG`!O$!F/D)MX+`P+```,BW@L+)`9"1P`#`!Y8!![`6<+S`(`$AL`I0O.
  972. XM+?_\3KH8CD_O``Q2;>"P8-`O+?_\3KH:@%A/0J=.NAK43.U,[.!\3EU.=;_L$
  973. XM!51E``Q62.<C$"9O`!0P+```9AHB`%)!.4$``"0`2,+E@D'L!9PABR@`8```-
  974. XMG')DL$%G``"4?@`P+```2,"^@&Q<(`?E@$'L!9RW\`@`9#P\+```2,:\AV\:Q
  975. XM(`;E@"(&Y8%![`680^P%G".P&``(`%.&8.(@!^6`0>P%G"&+"``P+```4D`YV
  976. XM0```8!(@!^6`0>P%G+?P"`!G!%*'8)HP+```(@!(P>6!0>P%F+?P&`!C%B(`*
  977. XM4D$Y00``(@!(P>6!0>P%G"&+&`!,WPC$3G5.=4YU2.<',"XO`!@F;P`<+"\`7
  978. XM("\'3KH?N%A/)$`@"F8$</]@-@@J``,``V<02'@``D*G+P=.NA+$3^\`#"\&&
  979. XM+PLO*@`$3KH:!$_O``PJ`$JL!6AG!'#_8`(@!4S?#.!.=0``````````<&%(H
  980. XMYP,0)F\`$"!+2AAF_%.(D<LL"'X`'AM*AV<R4ZP"YFT6(&P"WD/H``$I20+>N
  981. XM(`<0@'(`$@!@W"`'<@`2`$AL`MHO`4ZZ"#Y03R(`8,9(;`+:2'C__TZZ""Q0Q
  982. XM3R`&3-\(P$YU````````<&%.5?_<2.</,"9O`$1\`$'M``PK2/_R'AM*!V<`,
  983. XM`0IP);X`9@``S!X;<``0!W(874%K``"(L'L0"&;T3OL0!`!D8```4`!X8```1
  984. XM&@!P8```%`!S8````B!M__(D6"M(__)@2B!M__(H&"M(__)%[?_L>@=*A6L6K
  985. XM(`1R#\"!0?H`P-'`%)!3BNB$4X5@YD(M_^U@&B!M__(H&"M(__(O!$AM_^5..
  986. XMN@SX4$]%[?_E+PI.NO[D6$_<@&``_UY2AE.L`N9M&"!L`MY#Z``!*4D"WB`'K
  987. XM$(!R`!(`8`#_/G``$`=(;`+:+P!.N@<R4$\B`&``_RA2AE.L`N9M&"!L`MY#S
  988. XMZ``!*4D"WB`'$(!R`!(`8`#_"'``$`=(;`+:+P!.N@;\4$\B`&``_O)(;`+:.
  989. XM2'C__TZZ!N@@!DSM#/#_Q$Y=3G4P,3(S-#4V-S@Y04-$148```!.5?_$2.<G<
  990. XM,"9O`%PD;P!@?@!\`'H`<``;?``@__MR`"M!__9T_RM"__)![?_0&T#_\1M`P
  991. XM__PK0?_D*T'_Z"M(_\Q*$V="<``0$W(874%K.+![$`AF]D[[$`0`(V```"``>
  992. XM(&```!8`*V````P`+6````)^`6`.?`%@"GH!8`8;?``!__Q2BV"Z$!-R,+`!Q
  993. XM9@92BQM!__MP*K`39A`@4D/H``0DB2M0__92BV`.2&W_]B\+3KH+T%!/U\`0(
  994. XM$W(NL`%F)E*+<"JP$V80(%)#Z``$)(DK4/_R4HM@#DAM__(O"TZZ"Z)03]?`P
  995. XM$!-R;+`!9@H;?``!__%2BV`(<FBP`68"4HL0&W(`$@`;0/_P<#!=0&L``E2RH
  996. XM>P`(9O1.^P`$`&-@``(J`'-@``'H`%A@``%^`'A@``%X`'!@``%>`&]@``$,H
  997. XM`'5@``#B`&1@```"2BW_\6<,(%)#Z``$)(D@$&`*(%)#Z``$)(D@$"M`_^QL_
  998. XM"G(!1*W_["M!_^A*K?_H9P1P+6`*2@9G!'`K8`)P(!M`_]!P`!`&(BW_Z(*`L
  999. XM<``0!8*`9PA2K?_,4JW_Y"\M_^PO+?_,3KH)^E!/*T#_R"`M__)*@&H&<@$K"
  1000. XM0?_R("W_R"(M__*2@$CM``+_Q&\N(&W_S")(T\%@`A+84X!D^G``$"W_^R(MX
  1001. XM_\0@;?_,8`(0P%.!9/H@+?_R*T#_R-&M_^1![?_0*TC_S$H'9P`!4!M\`"#_*
  1002. XM^V```49*+?_Q9PP@4D/H``0DB2`08`H@4D/H``0DB2`0*T#_[&``_V)*+?_Q@
  1003. XM9PP@4D/H``0DB2`08`H@4D/H``0DB2`0*T#_[$HM__QG$B!M_\P0_``P<@$K,
  1004. XM0?_D*TC_S"\`+RW_S$ZZ"5103RM`_\A@`/\H&WP`,/_[("W_\DJ`:@9P""M`1
  1005. XM__)*+?_Q9PP@4D/H``0DB2`08`H@4D/H``0DB2`0*T#_[$HM__QG%B!M_\P0>
  1006. XM_``P$/P`>'("*T'_Y"M(_\PO`"\M_\Q.N@DP4$\K0/_(<%BP+?_P9@#^ODAM$
  1007. XM_]!.N@@,6$]@`/ZP(%)#Z``$)(DB4"M)_\QF"$'Z`-PK2/_,(&W_S$H89OQ31
  1008. XMB)'M_\PK2/_D("W_\DJ`:RJQP&\F*T#_Y&`@<`$K0/_D(%)#Z``$)(D@$!M`P
  1009. XM_]!"+?_18`9P`&```(P@+?_D(BW_]K*`;`AT`"M"__9@!)&M__9*!V<V4ZW_$
  1010. XMY&T8<``@;?_,$!@O`"M(_\P@;0`03I!83V#B4ZW_]FU(<``0+?_[+P`@;0`0'
  1011. XM3I!83V#H4ZW_]FT2<``0+?_[+P`@;0`03I!83V#H4ZW_Y&T8<``@;?_,$!@O(
  1012. XM`"M(_\P@;0`03I!83V#B(`M,WPSD3EU.=0``3E7_]DCG`3`F;P`>)&\`(BMM.
  1013. XM`!#_]AX:2@=G-'`EO@!F(K`29@12BF`:+PM(;?_V+PIA`/O,3^\`#"M`__IG@
  1014. XM!"1`8-)P`!`'+P!.DUA/8,9,WPR`3EU.=4Y5__!(YR$R)F\`+`RL````(`BJ"
  1015. XM;```AA`3<B"P`6<,<@FP`6<&<@JP`68$4HM@Z$H39V@@+`BJY8!2K`BJ0>P(4
  1016. XMLM'`)$AP(K`39B92BR2+2A-G"G`BL!-G!%*+8/)*$V8,2'@``4ZZ&FA83V">8
  1017. XM0AM@FB2+2A-G&!`3<B"P`6<0<@FP`6<*<@JP`6<$4HM@Y$H39@)@!D(;8`#_\
  1018. XM<DJL"*IF!B!L!8Q@!$'L"+(I2`BN2JP(JF9\0?H!)$/L"'`BV"+8(M@BV#*00
  1019. XM(FP%C"!I`"1(>``H+R@`!$AL"'!.N@8B3^\`#$'L"'`B""0\```#[BQL"9!.4
  1020. XMKO_B*4`',"E`!SAR!"E!!S0I0`=`*4$'/.6`D\DL>``$*T#_\$ZN_MH@;?_PB
  1021. XM(D`C:``(`*1^`"M`__1@*BQL"9!.KO_**4`',$ZN_\0I0`<X0?H`IB(()#P`G
  1022. XM``/M3J[_XBE`!T!^!"`'`$"``8&L!RP@!P!`@`*!K`<T`*P``(`#!SQ*K`,@C
  1023. XM9P1P`&`&(#P``(``+@!"K`+4(`<`0``!*4`"T'`!*4`"]B`'`$```BE``O)PZ
  1024. XM`BE``Q@@!P!``(`I0`,40?H5\BE(!8`O+`BN+RP(JDZZ\5I"ETZZ$:A,[4R$Y
  1025. XM_]Q.74YU8V]N.C$P+S$P+S,R,"\X,"\`*@``````````````````````````H
  1026. XM``````````````!P82\+)F\`"$JK`!1G#`@K``,`&V8$<`!@-B\L!0!.N@R^7
  1027. XM6$\G0``$)T``$$J`9@IP#"E`"8QP_V`6)VP%```4<//!JP`8<``G0``,)T``_
  1028. XM""9?3G4``````````````````$Y5_^Q(YR\0+B\`-"9O`#@H!W`QP*L`&&<&J
  1029. XM</]@``)P""L`!P`:5L!$`$B`2,`L`$JK`!1F``"$""L``@`;9GIP`"=```QRC
  1030. XM_[Z!9P`"0B\+3KK_3EA/2H!G#`CK``4`&W#_8``"*@CK``$`&TH&9PX@*P`4=
  1031. XM(@!$@2=!``Q@""`K`!0G0``,4ZL`#&T6(&L`!$/H``$G20`$(`<0@'(`$@!@L
  1032. XM$B`'<@`2`"\++P%A`/]24$\B`"`!8``!U@@K``(`&V=8</^^@&8&<`!@``'"M
  1033. XM(`<;0/__2@9G(G(*OH%F''("+P%(>@&R+RL`'"M!__!.NO8D3^\`#"H`8!IR"
  1034. XM`2\!2&W__R\K`!PK0?_P3KKV"$_O``PJ`'[_8```X`CK``$`&TH&9U)P_[Z`Q
  1035. XM9TQ4JP`,<@J^@68F(&L`!$/H``$G20`$$+P`#2(K``Q*@6L*+PLO`&$`_JY0L
  1036. XM3U*K``P@:P`$0^@``2=)``0@!Q"`(BL`#$J!:P`!''[_("L`!)"K`!`K0/_P;
  1037. XM9W((*P`&`!IG4DAX``)"IR\K`!Q.N@AT3^\`#"M`_^Q*!F<X4ZW_[&TR0J<O[
  1038. XM+?_L+RL`'$ZZ"%1(>``!2&W__2\K`!Q.N@6H3^\`&$JL!6AF"A`M__UR&K`!N
  1039. XM9\@O+?_P+RL`$"\K`!Q.NO4H3^\`#"H`8`)Z`'#_NH!F"`CK``4`&V`,NJW_+
  1040. XM\&<&".L`!``;2@9G#B(K`!0D`42")T(`#&`8""L``@`;9PAR`"=!``Q@""(K'
  1041. XM`!0G00`,(&L`$"=(``2^@&<N4ZL`#&T6(&L`!$/H``$G20`$(`<0@'(`$@!@`
  1042. XM$B`'<@`2`"\++P%A`/V04$\B`'`PP*L`&&<$</]@#'#_N(!F!'``8`(@!$S?Q
  1043. XM"/1.74YU#0H`````+FP%D$ZZ$0)(>0```!1.N@Y<``````````!P84Y5__@OL
  1044. XM"R9L"&P@"V8$1_H`?!E3"409:P`!"449:P`""49"+`E'0>P)1"E("3Q!ZP`#A
  1045. XM2&W_^"\(3KH"RE!/5H#7P"`M__@B/```#A!.NA%2*4`).$H39QX94PE(&6L`[
  1046. XM`0E)&6L``@E*<``90`E+<@$I00DT8`A"+`E(0JP)-$'L"4@I2`E`)E].74YU@
  1047. XM0U-4-@````````````````````````````````````````````````````!.N
  1048. XM5?_R2.<'$"9O`"9(;?_X3KH)#EA/>@`0+?_Y+``&!@`*?@"^!F0B<``0!U2`-
  1049. XM<@1.NA#62H%F"`:%```!;F`&!H4```%M4@=@VGX!$"W_^KX`9!1P`!`'<@!!N
  1050. XM[`,C$C`(`-J!4@=@Y'``$`94@'($3KH0EDJ!9@P0+?_Z<@*P`6,"4H5P`!`M3
  1051. XM__M3@-J`(`5R&$ZZ$%0J`'``$"W__-J`(`5R/$ZZ$$(J`'``$"W__=J`(`5R?
  1052. XM/$ZZ$#`J`'``$"W__MJ`3KK^@MJL"3@@"V<")H4@!4S?".!.74YU2.<@,"9OZ
  1053. XM`!`D2TH29R1P`!`20>P#_0@P``$(`&<*<@`2`'0@DH)@!'(`$@`4@5**8-@@T
  1054. XM"TS?#`1.=0``````````<&%.5?_X2.<#,"9O`"`D;P`D+B\`*"!*2AAF_%.(0
  1055. XMD<HL""!+2AAF_%.(D<L@"")+T\`K2?_XO(=C`BP'(`8@2F`"$MA3@&3Z(&W_\
  1056. XM^$(P:``@"TS?#,!.74YU("\`""!O``1.5?_T(D]R"DZZ#[`&00`P$L%*@&;P`
  1057. XM(`D0X;_)9OI"$)"/3EU.=0``("\`""!O``1.5?_T(D\B``)!``<&00`P$L'FN
  1058. XMB&;P(`D0X;_)9OI"$)"/3EU.=0``,#$R,S0U-C<X.6%B8V1E9B`O``@@;P`$+
  1059. XM0^\`!#(``D$`#Q+[$-SHB&;R(`DB#UB!$.&RB6;Z0A"0@4YU("\`""!O``1.8
  1060. XM5?_T(D]L!A#\`"U$@'(*3KH/#`9!`#`2P4J`9O`0X;_)9OI"$"`(3EV0KP`$R
  1061. XM3G4@;P`$(DAR`'``+P(,$``K9P8,$``M9@)22!`8!```,&T2#```"6X,)`'E&
  1062. XM@=*"TH'2@&#F#!$`+68"1($D'R`(4X`@;P`(((&0B4YU+P<N+P`(4JP)4"`'B
  1063. XM(&P)3!#`*4@)3"X?3G5.50``2.<`,"9O`!`D;P`40JP)4"E+"4Q(;0`0+PI(K
  1064. XM>O_&3KKV\B!L"4Q"$"`L"5!,[0P`__A.74YU3E7_Z$CG`3(N+P`T2H=N!G#_B
  1065. XM8```TG`(OH!D`BX`(`=6@"X``D?__"1M``@@;0`(T<??K`*P0^P"K"91*TC_T
  1066. XM\"M)__0@"V<``)`@2R`K``31P"M(_^PB;?_PM\EC$"2+)4<`!"QM__0LBG``D
  1067. XM8'BWR68:+%,DCB`K``0B`-*')4$`!"QM__0LBG``8%JUR&0(GZP"L'#_8$ZUA
  1068. XMR&8L2I-G#B!3L\AC")^L`K!P_V`XWZL`!$J39PZSTV8*("D`!-&K``0FD7``3
  1069. XM8!XK2__T*VW_[/_H)E-@`/]N(&W_]""*0I(E1P`$<`!,WTR`3EU.=0``````:
  1070. XM````<&%(YP$0)F\`#"XO`!`O!R\+3KK^]E!/3-\(@$YU2.<',"XO`!@F;P`<L
  1071. XM+"\`("\'3KH/7%A/)$`@"F8$</]@'B\&+PLO*@`$3KH*B$_O``PJ`$JL!6AG4
  1072. XM!'#_8`(@!4S?#.!.=0``+P<N+P`(4JP)5%.L`N9M%B!L`MY#Z``!*4D"WB`'%
  1073. XM$(!R`!(`8!0@!W(`$@!(;`+:+P%.NO@44$\B`"X?3G5.50``+PLF;P`,0JP)-
  1074. XM5$AM``PO"TAZ_ZQ.NO4H2&P"VDAX__].NO?D("P)5"9M__Q.74YU``!.5?_F_
  1075. XM2.</,"9O`#HN+P`^0BW__T*L!6@K;`F,__)Z`[JL`IQL$B`%YX!![`<L2K`(J
  1076. XM`&<$4H5@Z"`L`IRPA68,<!@I0`F,</]@``$J(`7G@$'L!RS1P"1(2JT`$&<(Z
  1077. XM""T``@`39PHK?````^S_[F`(*WP```/N_^X@/```@`#`K`*TL8<(!P`#9PP@&
  1078. XM!P)`__PN``!'``(@!W(#P($,@`````)G#`R``````6<$2H!F!BP'4H9@#'`6$
  1079. XM*4`)C'#_8```M"`'`H````,`9P``B`@'``IG%AM\``'__R\M_^XO"TZZ":I06
  1080. XM3R@`8#P(!P`)9A9(>`/M+PM.N@E,4$\H`$J$:@0(QP`)"`<`"6<:&WP``?__X
  1081. XM*6W_\@F,+RW_[B\+3KH)T%!/*`!*+?__9S8@!W)XTH'`@4J`9RI*A&LF+P1.Y
  1082. XMN@H82'@#[2\+3KH(^D_O``PH`&`.2'@#[2\+3KH(Z%!/*`!*K`5H9P1P_V`(^
  1083. XM)(8E1``$(`5,WPSP3EU.=0```````````````````````'!A2.<!,"XO`!!*Y
  1084. XMK`E89Q8D;`E8+Q(O+`E83KK]?E!/D<@I2`E82H=F!'``8!Y8AR\'3KH"CEA/"
  1085. XM)D!*@&8$<`!@"B1+)(=!ZP`$(`A,WPR`3G5(YP\0+B\`&"PO`!PJ+P`@+P=.7
  1086. XMN@S`6$\F0"`+9@1P_V`>+P4O!B\K``1.N@=P3^\`#"@`2JP%:&<$</]@`B`$0
  1087. XM3-\(\$YU``!.5?_H2.</$"9O`#0@$R(\``%1@$ZZ"@XK0/_P+``@$R(\``%1S
  1088. XM@$ZZ"?PN`2`'(CP```X03KH)[B@`(`<B/```#A!.N@G@+@$@!W(\3KH)UBM`P
  1089. XM_^@@!W(\3KH)RBX!*4<)8"EM_^@)9"E$"6A(;?_P80``3"H`(`4$@```!VPIG
  1090. XM0`ET*6W_\`E\+H5(;?_P80``ABE`"7`@+?_P4H`I0`EL(`98@'('3KH)?"E!!
  1091. XM"7A![`E@(`A,[0CP_]1.74YU2.<#$"9O`!`N/```![(L$PR&```!;6\>(`=R@
  1092. XM!$ZZ"4A*@68(!(8```%N8`8$A@```6U2AV#:#(8```%M9A`@!W($3KH)(DJ!1
  1093. XM9P12AWP`)H8@!TS?",!.=4CG!Q`F;P`4+B\`&"`'<@1.N@C\2H%F!G`=*4`#&
  1094. XM.'H`+!-P#+J`;!P@!>6`0>P#-"(P"`"RAFX,0>P#-)RP"`!2A6#>)H8@!4S?R
  1095. XM".!.=4CG`S`N+P`42H=N!G``8```I'`(OH!D`BX`(`=6@"X``D?__$7L`JPFU
  1096. XM4B`+9T`@*P`$L(=M,K"'9@P@4R2(GZP"L"`+8&X@*P`$D(=R"+"!918@2]''6
  1097. XM)(@D2"23)4``!)^L`K`@"V!,)$LF4V"\(`<B+`,PT(%3@$ZZ"$8B+`,P3KH(#
  1098. XM'BP`4(8@!E:`+``"1O_\+P9.N@R66$\F0"`+9Q(O!B\+3KKY_BZ'80#_5%!/1
  1099. XM8`)P`$S?#,!.=0``````````<&$O!RXO``@O!TZZ_S)83RX?3G4``$Y5_^!(H
  1100. XMYR\0)F\`0$'M__0B""QL"9!.KO]`("W_]"X\```'NBP`*T#_\`R&```!;6\>P
  1101. XM(`=R!$ZZ![!*@68(!(8```%N8`8$A@```6U2AV#:#(8```%M9A`@!W($3KH'A
  1102. XMBDJ!9P12AWP`(`8B!P2!```'O!=!``%T`!0!*T#_\"`"<@1.N@=D2H%F!'`=U
  1103. XM8`)P'!E``V5X`"HM__!P#+B`;!YP`$'L`V00,$@`L(5N$'``0>P#9!`P2`":0
  1104. XM@%*$8-P@!2($4H$700`"*T#_\%*`%T```R`M__1R!TZZ!PX6@2`M__AR/$ZZW
  1105. XM!P(70``$("W_^'(\3KH&]!=!``4@+?_\<C).N@;F%T``!B`M__QR,DZZ!MC26
  1106. XM@1=!``=,WPCT3EU.=2\+)F\`""`+9Q!"ITZZ^_Y83R!+68@I2`E8<``F7TYU5
  1107. XM````````<&%(YP$P)F\`$"1O`!1^`!X;2H=G$B\*+P=.N@`64$]2@&;J</]@;
  1108. XM`G``3-\,@$YU``!(YP$0+B\`#"9O`!`(*P`&`!MG$G`*OH!F#"\++P=.NO'8R
  1109. XM4$]@,%.K``QM%B!K``1#Z``!)TD`!"`'$(!R`!(`8!(@!W(`$@`O"R\!3KKQF
  1110. XMJE!/(@`@`4S?"(!.=4CG`2`N+P`,4JP)B"!L"813J``,;18B:``$1>D``2%*5
  1111. XM``0@!Q*`<@`2`&`2(`=R`!(`+P@O`4ZZ\6103R(`3-\$@$YU3E4``$CG`#`F]
  1112. XM;P`0)&\`%$*L"8@I2PF$2&T`$"\*2'K_G$ZZ[FPNBTAX__].NO$J("P)B$SM3
  1113. XM#`#_^$Y=3G4``$Y5__A(YP`P1^P"N"`+9PQ*JP`89P8D2R938/`@"V8B2'@`:
  1114. XM(DZZ_6Y83R9`2H!F!'``8!PDBW`A<@`@2Q#!4<C__"\++RT`#"\M``A.N@`.@
  1115. XM3.T,`/_P3EU.=0``3E7_\$CG#S`F;P`T)&\`.$JJ`!AG""\*3KH!3EA/*BP#!
  1116. XM('X!<``0,W@`#$``8F<*#$``868,>@!@!BH\``"``%*'<BNR,W@`5\!$`$B`$
  1117. XM2,`H`'``$!,,0`!W9P``B`Q``')G0@Q``&%F``"^2'@`#"\\``"!`B\M``A.9
  1118. XMNOAL3^\`#"P`</^\@&8&<`!@``#02H1G!G!`T(!@`G`"+@``1T``8```B$J$%
  1119. XM9P1P`F`"<```0(``2'@`#"\`+RT`"$ZZ^"A/[P`,+`!P_[R`9@9P`&```(Q*I
  1120. XMA&<&<$#0@&`"<`$N`&!(2H1G!'`"8`)P`0!`@```0`$``$`"`$AX``PO`"\MR
  1121. XM``A.NO?B3^\`#"P`</^\@&8$<`!@1DJ$9P9P0-"`8`)P`BX`8`1P`&`RD<@EK
  1122. XM2``0<``E0``4)48`'"5J`!``!"5```PE0``(2H5F!B`\``"``"('@H`E00`8)
  1123. XM(`I,WPSP3EU.=0``2.<#,"9O`!0(*P`!`!MG$"\+2'C__TZZ[SQ03RX`8`)^H
  1124. XM`"`K`!A"@&<42JL`%&<.+RL`%"\K`!!.NO9N4$\O*P`<3KH%J%A/+`!P_[Z`L
  1125. XM9P9*AF8"<`!,WPS`3G5(YP,0+B\`$$?L`K@@"V<T""L``@`;9B@(*P`!`!MG%
  1126. XM("`K``20JP`0+`!*AF<2+P8O*P`0+RL`'$ZZY=)/[P`,)E-@R"\'3KH'$%A/J
  1127. XM3-\(P$YU``!(YS<0+B\`'"9O`"`L+P`D2JP%@&<$3KH%K$*L!6@B!R0+)@8L#
  1128. XM;`F03J[_T"H`</^Z@&8.3J[_?"E`!6AP!2E`"8P@!4S?".Q.=0``2.<_`"XOI
  1129. XM`!PL+P`@*B\`)$JL!8!G!$ZZ!6!"K`5H(`53@"(')`8F`"QL"9!.KO^^*`!PU
  1130. XM_[B`9@Y.KO]\*4`%:'`6*4`)C"`%#(`````"9Q8,@`````%G"$J`9A@@!F`4*
  1131. XM(`30AF`.(@=T`'8`+&P)D$ZN_[Y,WP#\3G4``$CG-Q`N+P`<)F\`("PO`"1*\
  1132. XMK`6`9P1.N@3D0JP%:"(')`LF!BQL"9!.KO_6*@!P_[J`9@Y.KO]\*4`%:'`%V
  1133. XM*4`)C"`%3-\([$YU``!(YR,0)F\`%"XO`!A*K`6`9P1.N@2<0JP%:"(+)`<LR
  1134. XM;`F03J[_XBP`2H9F$DZN_WPI0`5H<`(I0`F,</]@`B`&3-\(Q$YU``!.5?_\B
  1135. XM2.<A$"9O`!A*K`6`9P1.N@140JP%:"(+=/XL;`F03J[_K"X`2H=G"B('3J[_Y
  1136. XMIG#_8"8B"R0\```#[DZN_^(N`$J'9A).KO]\*4`%:'`"*4`)C'#_8`(@!TS?-
  1137. XM"(1.74YU3E7__$CG(1`F;P`82JP%@&<$3KH#\$*L!6@B"W3^+&P)D$ZN_ZPN&
  1138. XM`$J'9PPB!TZN_Z8B"TZN_[@B"R0\```#[DZN_^(N`$J'9A).KO]\*4`%:'`"_
  1139. XM*4`)C'#_8`(@!TS?"(1.74YU```O!RXO``A*K`6`9P1.N@..(@<L;`F03J[_*
  1140. XMW'``+A].=4Y5_[`O#DJL"5QF$D/Z`(AP`"QX``1.KOW8*4`)7'``(&P%F!`H+
  1141. XM__]#[?^P8`(2V%.`9/IP`"!L!9@0*/__0C4(L$'M_[`I2`-\2'@`*$AX`/IPW
  1142. XM`"\`+P!(;`.8<@`O`4AL`X0O`4ZZ`V1(>``43KH$3"QM_ZQ.74YU*BH@4W1AC
  1143. XM8VL@3W9E<F9L;W<@*BH``$58250``&EN='5I=&EO;BYL:6)R87)Y````````V
  1144. XM`````````$CG,``D`"8!2$)(0\3!QL#`P=1#2$)"0M""3-\`#$YU2H!J```>.
  1145. XM1(!*@6H```Q$@6$``"!$@4YU80``&$2`1(%.=4J!:@``#$2!80``!D2`3G4O[
  1146. XM`DA!-`%F```B2$!(04A"-`!G```&A,$P`DA`-`"$P3`"2$(R`B0?3G4O`W80J
  1147. XM#$$`@&0```;AF5%##$$(`&0```;IF5E##$$@`&0```;EF55#2D%K```&XYE3:
  1148. XM0S0`YJA(0D)"YJI(0X#!-@`P`C0#2$'$P9""9```"%-#T(%D_G(`,@-(0^>XT
  1149. XM2$#!028?)!].=4Y5_YY(YS,R?@`@;`68'BC__W!/OH!O`BX`(`=#[?^O8`(2I
  1150. XMV%.`9/I"-7BOD\DL>``$3J[^VB9`2JL`K&=,("L`K.6`)$`L*@`X2H9F!"PK8
  1151. XM`*!*AF<T(@9!^@"R)`AV"RQL"9!.KO_0($=2AR`(&[P`"@BO(@9![?^O)`@F?
  1152. XM!RQL"9!.KO_0</]@3DJL"5QF$D/Z`(9P`"QX``1.KOW8*4`)7$'M_Z\I2`/,)
  1153. XM2'@`/$AX`/IP`"\`+P!(;`/H2&P#U$AL`\!"ITZZ`6Q/[P`@4X!G!'#_8`)P@
  1154. XM`$S?3,Q.74YU*BH@57-E<B!!8F]R="!297%U97-T960@*BH``$-/3E1)3E5%'
  1155. XM``!!0D]25``J*BH@0G)E86LZ(`!I;G1U:71I;VXN;&EB<F%R>0```$Y5__POH
  1156. XM"R9O`!!.NNQ$(!.0K`DX*T#__$AM__Q.NO/.+H!.N@$8)FW_^$Y=3G4``$CGM
  1157. XM`1`N+P`,+P=.N@`\6$\F0"`+9@1P_V`H""L``@`#9P9P`":`8!HO*P`$3KK\D
  1158. XMOEA/<``F@$JL!6AG!'#_8`)P`$S?"(!.=2\'+B\`"'``*4`%:$J':R*^K`*<'
  1159. XM;!P@!^>`0>P'+$JP"`!G#B`'YX!![`<LT<`@"&`(<`DI0`F,<``N'TYU``!([
  1160. XMYP$"<``B/```,``L>``$3J[^SBX``H<``#``2H=F!'``8"!*K`6`9Q@@;`6`U
  1161. XM3I!*@&8$<`!@#$AX`!1.N@$"6$\@!TS?0(!.=6&T3G4``$CG,#(L;`E<(&\`^
  1162. XM&")O`!PD;P`@)F\`)"`O`"@B+P`L)"\`,"8O`#1.KOZD3-],#$YU```O"R9OD
  1163. XM``@@*P`8Y8`B*P`0Y8$O*P`4+Q,O*P`$+RL`""\K``Q![`4$+S`8`$'L!30OK
  1164. XM,`@`2'H`9$AL"91.NNY`3^\`)$'L"90@""9?3G5*86X`1F5B`$UA<@!!<'(`J
  1165. XM36%Y`$IU;@!*=6P`075G`%-E<`!/8W0`3F]V`$1E8P!3=6X`36]N`%1U90!7.
  1166. XM960`5&AU`$9R:0!3870`)7,@)7,@)3`R9"`E,#)D.B4P,F0Z)3`R9"`Q.24P2
  1167. XM,F0*`$CG!P`N+P`0("P"G%.`+`!*1FLP(`9(P.>`0>P'+"HP"`!*!6<:"`4`+
  1168. XM`F84(`9(P.>`0>P'+"\P"`1.NOKH6$]31F#,+P=.NM>>6$],WP#@3G4``$CG)
  1169. XM`#(F;`FP(`MG%"13(DL@*P`(+'@`!$ZN_RXF2F#HD<@I2`FT*4@)L$S?3`!.9
  1170. XM=4CG`3(N+P`4<`S>@"`'<@`L>``$3J[_.B9`(`MF!'``8#HG1P`(1>P)L"!J'
  1171. XM``0G2``$D<@FB$J29@(DBTJJ``1G!B)J``0BBR5+``1*K`*@9@0I2P*@0>L`+
  1172. XM#"`(3-],@$YU``````````````````````/L`````@````````:,```%;@``D
  1173. XM``(````"````#`````8````````#\@```^D````````#\@```^H```%4````N
  1174. XM_U6J=P!5<V%G93H@340@6SYR97!O<G1F:6QE72!;+7%A9&1R97-S9FEL95T*M
  1175. XM``!#86YN;W0@;W!E;B!O=71P=70@9FEL92X*`%5S86=E.B!-1"!;/G)E<&]R_
  1176. XM=&9I;&5=(%LM<6%D9')E<W-F:6QE70H``$U$+2U-96UO<GD@1&EA9VYO<W1I=
  1177. XM8RX*`&)Y($9A8F)I86X@1RX@1'5F;V4L($E)20H`5F5R<VEO;B`Q+C$L(#$P5
  1178. XM($%P<FEL(#$Y.#D*"@``365M;W)Y('1E<W1E9"`E<PH*``!!;&QO8V%T:6YG3
  1179. XM("5L9"!B>71E(&)L;V-K<RX*``!3;W)T:6YG(&)L;V-K(&QI<W0N"@``4V]R8
  1180. XM="!C;VUP;&5T92X*`$)L;V-K<R!E>&%M:6YE9#H*`$)L;V-K(",@("`@061DI
  1181. XM<F5S<R`@("`@("`@(%-I>F4*"@`E-&0@("`@("`E.&Q8("`@("`@)3=L9`H`@
  1182. XM``H`26YI=&EA;&EZ:6YG(&)L;V-K("5D+"`E;&0@8GET97,N"@``5&5S=&EN`
  1183. XM9R!V86QU92`E6"X*``!497-T:6YG(&)L;V-K("5D+"`E;&0@8GET97,@=VETG
  1184. XM:"`E6`H``$524D]2(2!!9&1R97-S.B`E.&Q8("!F;W5N9#H@)3)8("!E>'!ER
  1185. XM8W1E9#H@)3)8"@``5&5S=&EN9R!V86QU92`E6"X*``!497-T:6YG(&)L;V-KL
  1186. XM("5D+"`E;&0@8GET97,@=VET:"`E6`H``$524D]2(2!!9&1R97-S.B`E.&Q8`
  1187. XM("!F;W5N9#H@)3)8("!E>'!E8W1E9#H@)3)8"@``"DU$(&9O=6YD("5D(&5R!
  1188. XM<F]R<RX*`$9R965I;F<@8FQO8VL@)60N"@``)3AL6`H````````H````````=
  1189. XM`````````````````````(`````"V@``````````````````````````````<
  1190. XM`````````````OP`````````````````````````````````````````````^
  1191. XM`````````````````````````````````````````````(``'QP?'A\>'Q\>1
  1192. XM'QX?```$`````!\````<````'P```!X````?````'@```!\````?````'@``Q
  1193. XM`!\````>````'Q\<'QX?'A\?'A\>'___````#@`.````````````````__\`A
  1194. XM```$``0````````E%@```W#__P````0`!````````"4L`````/__````#@`.G
  1195. XM````````)Q0`````__\````$``0``````````````ZS__P````0`!```````V
  1196. XM`"<P`````/__````!``$````````)SH``````"`@("`@("`@("@H*"@H("`@&
  1197. XM("`@("`@("`@("`@("`@2!`0$!`0$!`0$!`0$!`0$(2$A(2$A(2$A(00$!`0`
  1198. XM$!`0@8&!@8&!`0$!`0$!`0$!`0$!`0$!`0$!`0$0$!`0$!""@H*"@H("`@("^
  1199. XM`@("`@("`@("`@("`@("`A`0$!`@("`@("`@("`@*"@H*"@@("`@("`@("`@H
  1200. XM("`@("`@("!($!`0$!`0$!`0$!`0$!`0A(2$A(2$A(2$A!`0$!`0$!"!@8&!4
  1201. XM@8$!`0$!`0$!`0$!`0$!`0$!`0$!`1`0$!`0$(*"@H*"@@("`@("`@("`@("8
  1202. XM`@("`@("`@("$!`0$"````````(````HZ@``*.X``"CR```H]@``*/H``"C^<
  1203. XM```I`@``*08``"D*```I#@``*1(``"D6```I&@``*1X``"DB```I)@``*2H`U
  1204. XM`"DN```I,@```^P````8````````!4P```5(```%1```!4````4\```%.```C
  1205. XM!30```4P```%+```!2@```4D```%(```!1P```48```%%```!1````4,```%<
  1206. XM"```!00```/T```#X````[@```.D```#D`````0````"```#T````Y0```+:L
  1207. X,```"N`````````/RO
  1208. X``
  1209. Xend
  1210. Xsize 12432
  1211. SHAR_EOF
  1212. echo "extracting MQ.uu"
  1213. sed 's/^X//' << \SHAR_EOF > MQ.uu
  1214. X
  1215. Xbegin 644 MQ
  1216. XM```#\P`````````#``````````)```:10````$```1]```/I```&D21()`!).
  1217. XM^0````!'^0```A!R`"`\````FV`")L%1R/_\+'@`!"E.`D@I3P)00JP"3"9N4
  1218. XM`11P`"(\```P`$ZN_LXI:P"8`D1*JP"L9P``<"`/D*\`!`:`````@"E``A1A=
  1219. XM``$N(&L`K-'(T<@B:``0T\G3R2`"<@`2&2E)`EC0@5*`0F=2@`)`__Z?P%6`&
  1220. XM0G<(`"`"4X#4@1^R```@`%."4<C_]A^\`"`@`%."'[$@`"``4<K_^")/+PE@Z
  1221. XM``!X*6L`.@(4<']2@-&L`A1A``#"0>L`7$ZN_H!!ZP!<3J[^C"E``DPO`"1`M
  1222. XM("H`)&<2+&P$;"!`(B@``"E!`D1.KO^"(BH`(&<:)#P```/M3J[_XBE``E1G&
  1223. XM"N6(($`G:``(`*0@;`),+PA(;`(0(&@`)"EH``0"6$ZZ`:!.N@B$<`!@!"`OD
  1224. XM``0O`"`L`CQG!"!`3I!.NA@<+'@`!")L!&Q.KOYB3KH!=DJL`DQG&B(L`E1GS
  1225. XM!$ZN_]PL>``$3J[_?")L`DQ.KOZ&(!\N;`)03G5P9&"T0_H`$'``3J[]V"E`C
  1226. XM!&QG[$YU9&]S+FQI8G)A<GD`3E7^2$CG/S!P`"X`1^W^6"M`_E`K0/Y44H<O<
  1227. XM"TAL``!.N@\24$]8BU*`9P9P9+Z`;>8@!U.`0J=(;``&+T``*$ZZ&#Y03RE`H
  1228. XM`EQ*@&8*2'@`%$ZZ$JA83TZZ&`8@;`)<)F@!0F```)XD:P`08```CGH`>`!@3
  1229. XM=D'M_EC1Q"9((`HB*@`$T(%3@"03L()E9"`*L()B5"`*E(`@`G8'P(.4@"P"!
  1230. XMDH8N`5&'9@8E1@`$8!0@"M"&4(`@0""2(4<`!"2`)48`!"9M_DQ*AF842JW^K
  1231. XM4&8((%(G2``08`8@;?Y0())1JP`<4*W^5%*%6(2ZKP`@;80K2OY0)%(F;?Y,,
  1232. XM(`IF`/]P)E,K2_Y,2I-F`/]<3KH78"\M_E1(;``43KH`Y$SM#/S^*$Y=3G5.:
  1233. XM=4YU2.<',"XO`!@F;P`<+"\`("\'3KH58%A/)$`@"F8$</]@-@@J``,``V<0%
  1234. XM2'@``D*G+P=.NA!T3^\`#"\&+PLO*@`$3KH1X$_O``PJ`$JL`BAG!'#_8`(@L
  1235. XM!4S?#.!.=0``````````<&%(YP,0)F\`$"!+2AAF_%.(D<LL"'X`'AM*AV<R2
  1236. XM4ZP`=FT6(&P`;D/H``$I20!N(`<0@'(`$@!@W"`'<@`2`$AL`&HO`4ZZ"*90T
  1237. XM3R(`8,9(;`!J2'C__TZZ")103R`&3-\(P$YU````````<&%.5?_<2.</,"9OD
  1238. XM`$1\`$'M``PK2/_R'AM*!V<``0IP);X`9@``S!X;<``0!W(874%K``"(L'L0U
  1239. XM"&;T3OL0!`!D8```4`!X8```&@!P8```%`!S8````B!M__(D6"M(__)@2B!M3
  1240. XM__(H&"M(__)%[?_L>@=*A6L6(`1R#\"!0?H`P-'`%)!3BNB$4X5@YD(M_^U@[
  1241. XM&B!M__(H&"M(__(O!$AM_^5.N@Q84$]%[?_E+PI.NO[D6$_<@&``_UY2AE.LC
  1242. XM`'9M&"!L`&Y#Z``!*4D`;B`'$(!R`!(`8`#_/G``$`=(;`!J+P!.N@>:4$\B7
  1243. XM`&``_RA2AE.L`'9M&"!L`&Y#Z``!*4D`;B`'$(!R`!(`8`#_"'``$`=(;`!JF
  1244. XM+P!.N@=D4$\B`&``_O)(;`!J2'C__TZZ!U`@!DSM#/#_Q$Y=3G4P,3(S-#4V?
  1245. XM-S@Y04-$148```!.5?_@2.<G,"9O`$`D;P!,<`!R`!(3*T#_\"M`_^Q![`$)E
  1246. XM"#```A@`9R@@+?_L<@I.NA$"<@`2&W0/PH+0@2M`_^QP`!`30>P!"0@P``(()
  1247. XM`&;8$!-R;+`!9@I2BW`!*T#_\&`(<FBP`68"4HL@;0`,3I`N`'!CL!-G%D'LE
  1248. XM`0D(,``#>`!G"B!M``Q.D"X`8.IP_[Z`9@P@;0`0((=P`&```YAP`!`3<C9=#
  1249. XM06L``WRP>Q`(9O1.^Q`$`'-@``,V`&-@``+B`&A@``*&`%A@``%&`'A@``%``
  1250. XM`'!@``$N`&]@``"^`&1@```,`'5@```"?`!@-GP`2JW_[&<*#*T````!_^QOH
  1251. XM)'`MOH!G!G(KOH%F&+Z`9@1P_V`"<``L`"!M``Q.D"X`4ZW_[$'L`0D(,``"<
  1252. XM>`!F#"!M`!`@AW``8``"^D*M_^@@+?_H<@I.N@_H(@=T#\*"T($K0/_H(&T`?
  1253. XM#$Z0+@!3K?_L9PQ![`$)"#```G@`9M`@"F<``K1*AFH$1*W_Z$JM__!F#"!2\
  1254. XM("W_Z""`8``"FB!2(*W_Z&```I!P,+Z`;09P-[Z`;PP@;0`0((=P`&```H1"U
  1255. XMK?_H("W_Z.>`(@=T!\*"T($K0/_H(&T`#$Z0+@!3K?_L9PQP,+Z`;09P-[Z`S
  1256. XM;]0@"F<``D)*K?_P9@P@4B`M_^@@@&```C`@4B"M_^A@``(F2JW_[&8&<`@KG
  1257. XM0/_L0>P!"0@P``=X`&8,(&T`$""'<`!@``(.*@<@;0`,3I`N`$JM_^QG"@RM1
  1258. XM`````O_L;SQP,+J`9C9P>+Z`9P9P6+Z`9BH@;0`,3I`N`$'L`0D(,``'>`!FP
  1259. XM#"!M`!`@AW``8``!PD*M_^A3K?_L8$)![`$)"#```E@`9PH@!7(PD($K0/_HJ
  1260. XM0>P!"0@P``!8`&<*(`5R-Y"!*T#_Z$'L`0D(,``!6`!G"B`%<E>0@2M`_^A3&
  1261. XMK?_L9V)![`$)"#``!W@`9U8@+?_HZ8`K0/_H0>P!"0@P``)X`&<*(`=R,)"!O
  1262. XM@:W_Z$'L`0D(,```>`!G"B`'<C>0@8&M_^A![`$)"#```7@`9PH@!W)7D(&!^
  1263. XMK?_H(&T`#$Z0+@!@F"`*9P``_$JM__!F#"!2("W_Z""`8```ZB!2(*W_Z&``L
  1264. XM`.!![`$)"#```G@`9@P@;0`0((=P`&```-1\`"`&<@I.N@W&(@=T#\*"T($L)
  1265. XM`")M``Q.D2X`4ZW_[&<,0>P!"0@P``)X`&;4(`IG``"4(%(@!C"`8```BB`*J
  1266. XM9PP@4D/H``$DB2`'$(!3K?_L;R`@;0`,3I`N`'#_OH!G$B`*9^@@4D/H``$DU
  1267. XMB2`'$(!@VG#_OH!F"B!M`!`@AW``8$Y!ZP`!(`A@1B`*9PP@4D/H``$DB2`'#
  1268. XM$(`@;0`,3I`N`'#_OH!G$E.M_^QG#$'L`0D(,``#>`!GT"!20A!@!'``8`P@^
  1269. XM;0`0((=!ZP`!(`A,WPSD3EU.=0```````'!A2.<A$"XO`!`F;P`4</^^@&=@]
  1270. XM""L````;9UAR,,*K`!A*@69.""L``@`;9Q@B!Q=!`"!!ZP`@)T@`!'0!)T(``
  1271. XM""`!8"X@:P`$(FL`$+/(9@1P_V`>4ZL`!"!K``0@!Q"`""L`!P`:9P93JP`($
  1272. XM8`12JP`(3-\(A$YU3E7_\$CG(3(F;P`L#*P````@`]IL``"&$!-R(+`!9PQRJ
  1273. XM";`!9P9R"K`!9@12BV#H2A-G:"`L`]KE@%*L`]I![`/BT<`D2'`BL!-F)E*+%
  1274. XM)(M*$V<*<"*P$V<$4HM@\DH39@Q(>``!3KH.]%A/8)Y"&V":)(M*$V<8$!-RB
  1275. XM(+`!9Q!R";`!9PIR"K`!9P12BV#D2A-F`F`&0AM@`/]R2JP#VF8&(&P"3&`$T
  1276. XM0>P#XBE(`]Y*K`/:9GQ!^@$D0^P#H"+8(M@BV"+8,I`B;`),(&D`)$AX`"@O5
  1277. XM*``$2&P#H$ZZ!;9/[P`,0>P#H"(()#P```/N+&P$;$ZN_^(I0`)D*4`";'($<
  1278. XM*4$":"E``G0I00)PY8"3R2QX``0K0/_P3J[^VB!M__`B0"-H``@`I'X`*T#_C
  1279. XM]&`J+&P$;$ZN_\HI0`)D3J[_Q"E``FQ!^@"F(@@D/````^U.KO_B*4`"='X$)
  1280. XM(`<`0(`!@:P"8"`'`$"``H&L`F@`K```@`,"<$JL`+!G!'``8`8@/```@``N)
  1281. XM`$*L`&0@!P!```$I0`!@<`$I0`"&(`<`0``"*4``@G`"*4``J"`'`$``@"E`*
  1282. XM`*1!^@N>*4@"0"\L`]XO+`/:3KKV)D*73KH)'$SM3(3_W$Y=3G5C;VXZ,3`OU
  1283. XM,3`O,S(P+S@P+P`J`````````````````````````````````````````'!AF
  1284. XM+PLF;P`(2JL`%&<,""L``P`;9@1P`&`V+RP"#$ZZ"*I83R=```0G0``02H!FP
  1285. XM"G`,*4`$:'#_8!8G;`(,`!1P\\&K`!AP`"=```PG0``()E].=0``````````V
  1286. XM````````3E7_[$CG+Q`N+P`T)F\`."@'<#'`JP`89P9P_V```G`(*P`'`!I6%
  1287. XMP$0`2(!(P"P`2JL`%&8``(0(*P`"`!MF>G``)T``#'+_OH%G``)"+PM.NO].P
  1288. XM6$]*@&<,".L`!0`;</]@``(J".L``0`;2@9G#B`K`!0B`$2!)T$`#&`(("L`S
  1289. XM%"=```Q3JP`,;18@:P`$0^@``2=)``0@!Q"`<@`2`&`2(`=R`!(`+PLO`6$`F
  1290. XM_U)03R(`(`%@``'6""L``@`;9UAP_[Z`9@9P`&```<(@!QM`__]*!F<B<@J^X
  1291. XM@68<<@(O`4AZ`;(O*P`<*T'_\$ZZ];Q/[P`,*@!@&G(!+P%(;?__+RL`'"M!,
  1292. XM__!.NO6@3^\`#"H`?O]@``#@".L``0`;2@9G4G#_OH!G3%2K``QR"KZ!9B8@G
  1293. XM:P`$0^@``2=)``00O``-(BL`#$J!:PHO"R\`80#^KE!/4JL`#"!K``1#Z``!:
  1294. XM)TD`!"`'$(`B*P`,2H%K``$<?O\@*P`$D*L`$"M`__!G<@@K``8`&F=22'@`M
  1295. XM`D*G+RL`'$ZZ!;Q/[P`,*T#_[$H&9SA3K?_L;3)"IR\M_^PO*P`<3KH%G$AX2
  1296. XM``%(;?_]+RL`'$ZZ!41/[P`82JP"*&8*$"W__7(:L`%GR"\M__`O*P`0+RL`3
  1297. XM'$ZZ],!/[P`,*@!@`GH`</^Z@&8(".L`!0`;8`RZK?_P9P8(ZP`$`!M*!F<.8
  1298. XM(BL`%"0!1((G0@`,8!@(*P`"`!MG"'(`)T$`#&`((BL`%"=!``P@:P`0)T@`E
  1299. XM!+Z`9RY3JP`,;18@:P`$0^@``2=)``0@!Q"`<@`2`&`2(`=R`!(`+PLO`6$`V
  1300. XM_9!03R(`<##`JP`89P1P_V`,</^X@&8$<`!@`B`$3-\(]$Y=3G4-"@````!(R
  1301. XMYP<0)F\`%`@K``<`&E;`1`!(@$C`+@!P,,"K`!AG"D*K``AP_V```5@(*P`'^
  1302. XM`!MG%`@K``8`&V<,+PM(>/__3KK](E!/2JL`%&8V0JL`"`@K``(`&V<2<`$G6
  1303. XM0``40>L`("=(`!!@``"$+PM.NOR66$]*@&=V".L`!0`;</]@``$`2@=G9E2KE
  1304. XM``@@*P`(2H!N6B!K``1#Z``!)TD`!'P`'!`@!@R`````&F<N#(`````-9C)3I
  1305. XMJP`(;10@:P`$0^@``2=)``1P`!`08```M"\+80#_+EA/8```J`CK``0`&W#__
  1306. XM8```G"`&8```E@@K``$`&V9.".L````;+RL`%"\K`!`O*P`<3KH#:$_O``PJ>
  1307. XM`$J%:@8(ZP`%`!M*A68&".L`!``;2H5O&DH'9PH@!42`)T``"&`$)T4`""!KT
  1308. XM`!`G2``$<#+`JP`89Q9*!V<(</\G0``(8`9P`"=```AP_V`@4ZL`"&T2(&L`'
  1309. XM!$/H``$G20`$<``0$&`(+PMA`/Z$6$],WPC@3G4``$Y5__A(YP,P)F\`("1OZ
  1310. XM`"0N+P`H($I*&&;\4XB1RBP(($M*&&;\4XB1RR`((DO3P"M)__B\AV,"+`<@U
  1311. XM!B!*8`(2V%.`9/H@;?_X0C!H`"`+3-\,P$Y=3G4@+P`((&\`!$Y5__0B3VP&^
  1312. XM$/P`+42`<@I.N@7`!D$`,!+!2H!F\!#AO\EF^D(0(`A.79"O``1.=4Y5_^A(&
  1313. XMYR,P)F\`-$'M``Q^`"M(_^Q*$V<``1I\`!P;0>P!"0@P``-H`&;J<"6\@&8`,
  1314. XM`+IP);`39CA3K`!0;0YP`"!L`$P0&"E(`$Q@"DAL`$A.NOV46$\L`$'L`0D(X
  1315. XM,``#:`!FU'`EO(!GJB`'8```QG`JL!-G#"MM_^S_Z%BM_^Q@")'(4HLK2/_HF
  1316. XM0JW_]"\M_^A(;?_T2'H`I"\+3KKS?$_O`!`D0$J`5L!$`$B`2,!*@&<")DHB/
  1317. XM+?_T=/^R@F822H!G`E*'2H=O!"`'8&8@`F!B2H%G#$AL`$@O`4ZZ]X103R`*6
  1318. XM9D8@!V!*4ZP`4&T.<``@;`!,$!@I2`!,8`I(;`!(3KK\XEA/*T#_]"!M__1#(
  1319. XM[`$)(`@(,0`#"`!FS"`M__2PAF<`_NX@!V`(4H=@`/[D(`=,WPS$3EU.=5.L6
  1320. XM`%!M#G``(&P`3!`8*4@`3&`*2&P`2$ZZ_)!83TYU``!.5?_H2.<!,BXO`#1*C
  1321. XMAVX&</]@``#2<`B^@&0"+@`@!U:`+@`"1__\)&T`""!M``C1Q]^L`$1#[`!`9
  1322. XM)E$K2/_P*TG_]"`+9P``D"!+("L`!-'`*TC_[")M__"WR6,0)(LE1P`$+&W_S
  1323. XM]"R*<`!@>+?)9AHL4R2.("L`!"(`TH<E00`$+&W_]"R*<`!@6K7(9`B?K`!$[
  1324. XM</]@3K7(9BQ*DV<.(%.SR&,(GZP`1'#_8#C?JP`$2I-G#K/39@H@*0`$T:L`,
  1325. XM!":1<`!@'BM+__0K;?_L_^@F4V``_VX@;?_T((I"DB5'``1P`$S?3(!.74YU%
  1326. XM``````````!P84CG!S`N+P`8)F\`'"PO`"`O!TZZ!0!83R1`(`IF!'#_8!XO6
  1327. XM!B\++RH`!$ZZ`F!/[P`,*@!*K`(H9P1P_V`"(`5,WPS@3G4``$CG#Q`N+P`89
  1328. XM+"\`'"HO`"`O!TZZ!+A83R9`(`MF!'#_8!XO!2\&+RL`!$ZZ`9Q/[P`,*`!*A
  1329. XMK`(H9P1P_V`"(`1,WPCP3G4``````````'!A2.<#,"XO`!1*AVX&<`!@``"DY
  1330. XM<`B^@&0"+@`@!U:`+@`"1__\1>P`0"92(`MG0"`K``2PAVTRL(=F#"!3)(B?`
  1331. XMK`!$(`M@;B`K``20AW((L(%E%B!+T<<DB"1()),E0``$GZP`1"`+8$PD2R93^
  1332. XM8+P@!R(L`+30@5.`3KH"!B(L`+1.N@'>+`!0AB`&5H`L``)&__PO!DZZ!398?
  1333. XM3R9`(`MG$B\&+PM.NOW*+H=A`/]44$]@`G``3-\,P$YU``````````!P82\'R
  1334. XM+B\`""\'3KK_,EA/+A].=0``2.<#$"XO`!!'[`!((`MG-`@K``(`&V8H""L`,
  1335. XM`0`;9R`@*P`$D*L`$"P`2H9G$B\&+RL`$"\K`!Q.NNWV3^\`#"938,@O!TZZ;
  1336. XM!"A83TS?",!.=0``2.<W$"XO`!PF;P`@+"\`)$JL`D!G!$ZZ`X!"K`(H(@<D_
  1337. XM"R8&+&P$;$ZN_]`J`'#_NH!F#DZN_WPI0`(H<`4I0`1H(`5,WPCL3G4``$CG;
  1338. XM/P`N+P`<+"\`("HO`"1*K`)`9P1.N@,T0JP"*"`%4X`B!R0&)@`L;`1L3J[_>
  1339. XMOB@`</^X@&8.3J[_?"E``BAP%BE`!&@@!0R``````F<6#(`````!9PA*@&88:
  1340. XM(`9@%"`$T(9@#B('=`!V`"QL!&Q.KO^^3-\`_$YU``!(YS<0+B\`'"9O`"`L0
  1341. XM+P`D2JP"0&<$3KH"N$*L`B@B!R0+)@8L;`1L3J[_UBH`</^Z@&8.3J[_?"E`4
  1342. XM`BAP!2E`!&@@!4S?".Q.=0``+P<N+P`(2JP"0&<$3KH"=B('+&P$;$ZN_]QPQ
  1343. XM`"X?3G5(YS``)``F`4A"2$/$P<;`P,'40TA"0D+0@DS?``Q.=4J`:@``'D2`B
  1344. XM2H%J```,1(%A```@1(%.=6$``!A$@$2!3G5*@6H```Q$@6$```9$@$YU+P)(!
  1345. XM030!9@``(DA`2$%(0C0`9P``!H3!,`)(0#0`A,$P`DA",@(D'TYU+P-V$`Q!M
  1346. XM`(!D```&X9E10PQ!"`!D```&Z9E90PQ!(`!D```&Y9E50TI!:P``!N.94T,T$
  1347. XM`.:H2$)"0N:J2$.`P38`,`(T`TA!Q,&0@F0```A30]"!9/YR`#(#2$/GN$A`%
  1348. XMP4$F'R0?3G5.5?^>2.<S,GX`(&P"6!XH__]P3[Z`;P(N`"`'0^W_KV`"$MA3)
  1349. XM@&3Z0C5XKY/)+'@`!$ZN_MHF0$JK`*QG3"`K`*SE@"1`+"H`.$J&9@0L*P"@-
  1350. XM2H9G-"(&0?H`LB0(=@LL;`1L3J[_T"!'4H<@"!N\``H(KR(&0>W_KR0()@<L)
  1351. XM;`1L3J[_T'#_8$Y*K`1D9A)#^@"&<``L>``$3J[]V"E`!&1![?^O*4@`V$AX\
  1352. XM`#Q(>`#Z<``O`"\`2&P`]$AL`.!(;`#,0J=.N@$(3^\`(%.`9P1P_V`"<`!,C
  1353. XMWTS,3EU.=2HJ(%5S97(@06)O<G0@4F5Q=65S=&5D("HJ``!#3TY424Y510``[
  1354. XM04)/4E0`*BHJ($)R96%K.B``:6YT=6ET:6]N+FQI8G)A<GD`````````````;
  1355. XM```````O!RXO``AP`"E``BA*AVLBOJP`,&P<(`?G@$'L`F!*L`@`9PX@!^>``
  1356. XM0>P"8-'`(`A@"'`)*4`$:'``+A].=0``````````<&%(YP$"<``B/```,``LK
  1357. XM>``$3J[^SBX``H<``#``2H=F!'``8"!*K`)`9Q@@;`)`3I!*@&8$<`!@#$AX)
  1358. XM`!1.N@!&6$\@!TS?0(!.=6&T3G4``$CG,#(L;`1D(&\`&")O`!PD;P`@)F\`C
  1359. XM)"`O`"@B+P`L)"\`,"8O`#1.KOZD3-],#$YU``!(YP<`+B\`$"`L`#!3@"P`F
  1360. XM2D9K,"`&2,#G@$'L`F`J,`@`2@5G&@@%``)F%"`&2,#G@$'L`F`O,`@$3KK\=
  1361. XMO%A/4T9@S"\'3KKGWEA/3-\`X$YU``!(YP`R)FP$<"`+9Q0D4R)+("L`""QX(
  1362. XM``1.KO\N)DI@Z)'(*4@$="E(!'!,WTP`3G5(YP$R+B\`%'`,WH`@!W(`+'@`P
  1363. XM!$ZN_SHF0"`+9@1P`&`Z)T<`"$7L!'`@:@`$)T@`!)'()HA*DF8")(M*J@`$,
  1364. XM9P8B:@`$(HLE2P`$2JP`-&8$*4L`-$'K``P@"$S?3(!.=0``````````````T
  1365. XM````+PXL>0```DA.KO]\+%].=2\.+'D```)(3J[_=BQ?3G4O#BQY```"2")O9
  1366. XM``@@+P`,3J[]V"Q?3G4```/L````!0````(``!HP```:(```&A`````,````R
  1367. XM!@````````/R0``#Z0````````/R0``#Z@```(0E.&Q8"@!E>&5C+FQI8G)A5
  1368. XM<GD``$U1.B`E9"!B>71E<R!Q=6%R86YT:6YE9"X*```````H````````````/
  1369. XM``````````````````!J````````````````````````````````````````J
  1370. XM````C```````````````````````````````````````````````````````,
  1371. XM````````````````````````````````````@`````0`__\````.``X`````>
  1372. XM```7]`````#__P````0`!```````````````N/__````!``$````````&!``W
  1373. XM````__\````$``0````````8&@``````("`@("`@("`@*"@H*"@@("`@("`@`
  1374. XM("`@("`@("`@("!($!`0$!`0$!`0$!`0$!`0A(2$A(2$A(2$A!`0$!`0$!"!Q
  1375. XM@8&!@8$!`0$!`0$!`0$!`0$!`0$!`0$!`1`0$!`0$(*"@H*"@@("`@("`@("5
  1376. XM`@("`@("`@("`@("$!`0$"`@("`@("`@("`H*"@H*"`@("`@("`@("`@("`@@
  1377. XM("`@($@0$!`0$!`0$!`0$!`0$!"$A(2$A(2$A(2$$!`0$!`0$(&!@8&!@0$!8
  1378. XM`0$!`0$!`0$!`0$!`0$!`0$!$!`0$!`0@H*"@H*"`@("`@("`@("`@("`@("<
  1379. XM`@("`@(0$!`0(````````@````/L`````P````````$`````[````,0````#2
  1380. X8`````@```-P```!J````2`````````/R%
  1381. X``
  1382. Xend
  1383. Xsize 7404
  1384. SHAR_EOF
  1385. echo "End of archive 1 (of 1)"
  1386. # if you want to concatenate archives, remove anything after this line
  1387. exit
  1388.